为什么我的 init.d 脚本看起来就像运行了 set -e 一样?

为什么我的 init.d 脚本看起来就像运行了 set -e 一样?

我正在查看由前同事编写的 init.d 脚本,该脚本现在无法正常运行。它运行在centos-6上

经过一番实验,我找到了问题的原因。他编写的脚本在报告错误之前等待长达 30 秒的kil​​l -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启用的情况下运行脚本。

相关内容