Как я могу получить больше информации (кроме PID) о процессе-отправителе при получении сигнала? Например, имя процесса и его аргументы

#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
  

Я не уверен, что это самый правильный способ, но это помогло мне