我继承了相当多的代码,并且正在查看一个每小时重新启动一次服务的 cron 作业,没有其他脚本触及此进程并且运行此代码。
#The name of the process has been scrubbed to protect the guilty
procpid=$( pidof proc )
if [ -n "$procpid" ]; then
kill -HUP $procpid
procpid=$( pidof proc )
if [ -z "$procpid" ]; then
error "PROC ain't running, go figure out why"
fi
fi
99.9999% 的情况下这都是有效的。问题是,我是一个喜欢五个 9 的人,讨厌通过电子邮件发送给我的莫名其妙的系统日志消息,我想知道为什么:
杀死:(1076)-没有这样的过程
不断地出现在那里。这是否一定意味着在“如果”和“杀死”之间有其他东西正在杀死我的进程,或者可能发生了更阴险的事情?
因为很可能这段代码是好的,实际上其他东西杀死了两行之间的进程,所以是否有“什么杀了我”诊断类检查器的东西,我可以用它至少调试为什么我收到这些警告?
答案1
在不知道更多信息的情况下,尤其是所涉及过程的性质,我不得不说,是的,我猜它正在 和 之间pidof
消亡kill
。您可以使用killall
而不是基本上整个代码块。竞争条件仍然存在,但窗口会更短。
因为很可能这段代码是好的,实际上其他东西杀死了两行之间的进程,所以是否有“什么杀了我”诊断类检查器的东西,我可以用它至少调试为什么我收到这些警告?
UNIX 中不记录信号发送,因此您通常无法知道“是什么杀死了我”。您至少可以轻松地做的是在包装器 shell 脚本中运行相关进程。这至少可以记录进程死亡的原因。
#!/bin/sh
proc
logger "proc died with status $?"
$?
如果进程正常退出,则在 0 到 127 之间;如果进程因接收信号而死亡,则大于 128,信号编号为$?
-128。