Linux kernel 通过命令行记录外部过程信号

Linux kernel 通过命令行记录外部过程信号,linux-kernel,signals,posix,Linux Kernel,Signals,Posix,有没有办法监控相关PID处理的多个过程并记录所有过程信号事件 输入示例: PID=10 命令: 这里有一些PID=10的命令 预期输出示例: 时间戳\t 2(=SIGINT) 时间戳\t 9(=SIGKILL) 格式不相关,进程应始终监视PID,重要的是不要错过任何信号。您可以使用跟踪一系列进程接收到的所有信号: sudo strace -e signal=all -tt -f -p 27486 -p 27491 -p 27496 可以监控多个进程(多次使用-p PID),甚至可以不跟踪某些信

有没有办法监控相关PID处理的多个过程并记录所有过程信号事件

输入示例:
PID=10

命令:
这里有一些PID=10的命令

预期输出示例:
时间戳\t 2(=SIGINT)
时间戳\t 9(=SIGKILL)

格式不相关,进程应始终监视PID,重要的是不要错过任何信号。

您可以使用跟踪一系列进程接收到的所有信号:

sudo strace -e signal=all -tt -f -p 27486 -p 27491 -p 27496
可以监控多个进程(多次使用
-p PID
),甚至可以不跟踪某些信号(例如
-e'signal=!SIGINT'
将不跟踪
SIGINT
)。具有微秒精度的时间戳包含在
-tt
中,子进程(和线程)包含在
-f
中。需要Root权限

示例输出(例如,您可以使用
awk
轻松地对其进行后期处理):

strace:流程27486已连接
斯特拉斯:流程27491已附
strace:流程27496已连接
[pid 27496]20:54:50.917454重新启动系统调用(
[pid 27491]20:54:50.917480重新启动系统调用(
[pid 27486]20:54:50.917486重新启动\u系统调用()=?重新启动\u重新启动块(被信号中断)
[pid 27486]20:55:03.044313---SIGHUP{si_signo=SIGHUP,si_code=si_USER,si_pid=26964,si_uid=1000}---
[pid 27486]20:55:03.044624+++被SIGHUP杀死+++
[pid 27491]20:55:16.405891+++被SIGKILL杀死+++
20:55:45.270789)=?ERESTART\U重新启动块(被信号中断)
20:55:45.270929---SIGINT{si_signo=SIGINT,si_code=si_USER,si_pid=26964,si_uid=1000}---
20:55:45.271224+++被SIGINT杀死+++

(请注意,如果只监视一个进程,或者当除一个进程之外的所有进程都被终止时,该行不带PID前缀,但PID也可以从
si_PID
恢复)

我测试了strace,目的是让应用程序慢10倍。即使应用了一些事件过滤器,开销也会增加。strace也存在SIGCONT和SIGSTOP问题。你知道其他解决方案吗,可能是通过
perf
?你可以试试(在Debian/Ubuntu上:
sudo apt get install sysdig
),一个出色的监控工具,作为内核模块运行(开销非常小),能够按类型、PID和许多其他参数筛选事件。我正在接受您的答案。目标用途是跨多台机器监控我们公司的所有流程。似乎无法仅在外部观察处理的kill信号,而不会对其他系统调用产生任何重大影响。您尝试过
sysdig
?我相信eve它应该不会对性能有太大影响(因为它是作为内核模块运行的),尽管我还没有对它进行测试。是的,我尝试了它,包括其他工具,如
perf
。即使只跟踪了kill信号,开销也非常大(对于bs=1的dd,大约是5倍)。
strace: Process 27486 attached
strace: Process 27491 attached
strace: Process 27496 attached
[pid 27496] 20:54:50.917454 restart_syscall(<... resuming interrupted nanosleep ...> <unfinished ...>
[pid 27491] 20:54:50.917480 restart_syscall(<... resuming interrupted nanosleep ...> <unfinished ...>
[pid 27486] 20:54:50.917486 restart_syscall(<... resuming interrupted nanosleep ...>) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
[pid 27486] 20:55:03.044313 --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=26964, si_uid=1000} ---
[pid 27486] 20:55:03.044624 +++ killed by SIGHUP +++
[pid 27491] 20:55:16.405891 +++ killed by SIGKILL +++
20:55:45.270789 <... restart_syscall resumed> ) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
20:55:45.270929 --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=26964, si_uid=1000} ---
20:55:45.271224 +++ killed by SIGINT +++