有没有办法监控由相关PID处理的多个并记录所有过程信号事件?
示例输入:
PID = 10
命令:
这里有一些PID = 10的命令
预期输出示例:
timestamp \ t 2(= SIGINT)
timestamp \ t 9(= SIGKILL)
格式无关紧要,进程应该一直监视PID,重要的是不要错过任何信号。
答案 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。)