我正在查看由前同事编写的 init.d 脚本,该脚本现在无法正常运行。它运行在centos-6上
经过一番实验,我找到了问题的原因。他编写的脚本在报告错误之前等待长达 30 秒的kill -TERM 命令来运行citon。为此,他运行命令:
kill -0 $pid
测试被杀死的程序是否已经死亡。
Kill -0 命令抛出错误:
/etc/init.d/celerybeat line 211: kill (<pid>) - No such process
该行失败后它立即存在。
这是我对 set -e 的期望,但脚本不运行 set -e。事实上,它已经注释掉了该行,并附有一条注释,说明如果设置了该命令,kill -0 命令将失败,因此他非常清楚自己不希望设置它。
发生这种情况而不是我通过服务运行它或直接从 /etc/init.d 目录运行脚本
那么..为什么脚本运行时就像设置了 set -e 一样?更重要的是,我如何防止它以这种方式运行,或者重写该行以检查 pid 是否正在运行而不引发异常?
答案1
set +e
您可以使用或禁用“错误退出” set +o errexit
,或者在条件中运行该命令,以便错误退出不适用。最简单的是:
somecmd ... || true
但这会破坏返回值,并且您可能需要它,因为kill -0
除了设置它之外,它没有做太多事情。所以也许是这样的:
if kill -0 "$pid" 2>/dev/null ; then
echo it lives
fi
至于“为什么”,我认为 CentOS 6 运行 Upstart,并且至少一些 Ubuntu 文档似乎表明 Upstart 在set -e
启用的情况下运行脚本。