当收到信号时,如何获得发送过程的更多信息(PID除外)?像进程名称及其参数



我正在运行一个以systemd为init的嵌入式Linux操作系统。有时我看到systemd管理器在收到SIGUSR2信号后的早期启动期间进行日志转储。我使用signalfd()找到了发件人PID,但当我尝试使用cat /proc/pid/cmdline打印时,似乎没有它的踪迹。

我在kernel/signal.c中的kill()系统调用中添加了一小段代码来执行脚本,以获取有关发送方进程(cmdline、其父进程等(的更多详细信息

kill((系统调用中的代码:

// We are concerned only about SIGUSR2 to init
if (17 == sig && 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

我不确定这是否是最正确的方式,但这对我来说是个诀窍

最新更新