#linux #systemd #init #pid
#linux #systemd #инициализация #pid
Вопрос:
Я использую встроенную ОС Linux с systemd в качестве инициализации. Иногда я вижу, что systemd manager выполняет дамп журнала во время ранней загрузки при получении сигнала SIGUSR2. Я обнаружил, что PID отправителя используется signalfd()
, но к тому времени, когда я пытаюсь распечатать с помощью cat /proc/pid/cmdline
, кажется, от него не осталось и следа.
Ответ №1:
Я добавил небольшой фрагмент кода в kill()
системный вызов kernel/signal.c
для выполнения скрипта, чтобы получить более подробную информацию о процессе отправителя (cmdline, его родительский элемент и т. Д.)
Код в системном вызове kill():
// We are concerned only about SIGUSR2 to init
if (17 == sig amp;amp; 1 == pid)
{
printk("PID %d sent SIGUSR2 to systemdn", info.si_pid, pid);
char *envp[] = { "HOME=/", NULL };
char *argv[] = { "/bin/sh", "-c", "/etc/getSenderInfo.sh", NULL };
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
}
/etc/getSenderInfo.sh
#!/bin/sh
pid=$(dmesg | grep -w "sent SIGUSR2 to systemd" | awk '{print $2}')
while [ $pid -ne 0 ]
do
echo "ps -o ppid= -o cmd= -p $pid"
ppid=$(ps -o ppid= -o cmd= -p $pid)
echo $ppid
pid=$(echo $ppid | awk '{print $1}')
done
Я не уверен, что это самый правильный способ, но это помогло мне