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

Log external process signals via command line

有什么方法可以监控几个由相关PID处理并记录所有过程信号事件吗?

示例输入:
PID=10

命令:
这里有一些 PID=10

的命令

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

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

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

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

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

示例输出(例如,您可以使用 awk 轻松 post 处理):

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前缀,但PID也可以从si_pid中恢复。)