jco*_*lum 8 linux debugging signals
我在 CentOS 7 机器上运行了一个长时间(3 小时)的 shell 脚本。该脚本运行一个带有内部循环的循环,并curl在每次迭代中调用。
我正在使用PM2启动脚本,因为它已经在系统上并且非常适合管理进程。但是,它似乎不适用于 shell 脚本。今天早上我进来的时候我看到PM2已经重新启动了我的shell脚本6次。PM2 日志说它收到了 SIGINT 并重新启动。由于此脚本导致数据被推送到数据库,这意味着我的数据已被推送 6 次。那不是布埃诺。
我是唯一登录该框的人,因此它不是其他用户。
因此,下一个问题是这是 PM2 中的错误还是合法的 SIGINT。这就引出了一个问题:如果它是合法的,它来自哪里?在我将其作为 PM2 中的错误提交之前(这似乎是最有可能的事情),我必须确定(如果可能)操作系统是否以某种方式终止了这个进程。
sysdig可以使用evt.type=kill过滤器监控这些:
# terminal uno
perl -E 'warn "$$\n"; $SIG{INT}= sub { die "aaaaargh" }; sleep 999'
# terminal dos
sysdig -p '%proc.pname[%proc.ppid]: %proc.name -> %evt.type(%evt.args)' evt.type=kill
# terminal tres
kill -INT 11943 # or whatever
Run Code Online (Sandbox Code Playgroud)
可能需要一个更具体的过滤器来避免systemd垃圾邮件混淆sysdig输出,或者避免grep您的进程名称或 pid:
# sysdig -p '%proc.pname[%proc.ppid]: %proc.name -> %evt.type(%evt.args)' evt.type=kill
systemd[1]: systemd-udevd -> kill(pid=11969(systemd-udevd) sig=15(SIGTERM) )
systemd[1]: systemd-udevd -> kill(res=0 )
systemd[1]: systemd-udevd -> kill(pid=11970(systemd-udevd) sig=15(SIGTERM) )
systemd[1]: systemd-udevd -> kill(res=0 )
systemd[1]: systemd-udevd -> kill(pid=11971(systemd-udevd) sig=15(SIGTERM) )
systemd[1]: systemd-udevd -> kill(res=0 )
sshd[11945]: bash -> kill(pid=11943(perl) sig=2(SIGINT) )
sshd[11945]: bash -> kill(res=0 )
Run Code Online (Sandbox Code Playgroud)