收到信号后,如何获取发送方进程的更多信息(除 PID 外)?像进程名称和它的参数
How can I get more information (apart from PID) of the sender process when a signal is received ? Like process name and it's args
我是 运行 一个嵌入式 Linux OS,初始化为 systemd。有时我看到 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 systemd\n", 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 }')
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 }')
done
我不确定这是否是最正确的方法,但这对我有用
我是 运行 一个嵌入式 Linux OS,初始化为 systemd。有时我看到 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 systemd\n", 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 }')
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 }')
done
我不确定这是否是最正确的方法,但这对我有用