通过命令行记录外部过程信号
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
中恢复。)
有什么方法可以监控几个由相关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
中恢复。)