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

时间:2017-12-13 18:55:39

标签: linux-kernel signals posix

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

示例输入:
PID = 10

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

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

格式无关紧要,进程应该一直监视PID,重要的是不要错过任何信号。

1 个答案:

答案 0 :(得分:1)

您可以使用strace跟踪所选进程收到的所有信号:

sudo strace -e signal=all -tt -f -p 27486 -p 27491 -p 27496

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

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

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 +++

(请注意,如果只监视一个进程,或者除了一个进程外都被杀死,则该行不带有PID前缀,但也可以从si_pid恢复PID。)