我正在尝试编写一个 cron 作业脚本,该脚本将检查我的服务是否正在运行,如果没有运行则重新启动它们,这样我就不必手动执行此操作。
现在,我在网上查找了如何在 bash 脚本中检查服务的状态,基本上发现了以下内容,但有一些变化:
ps auxw | grep <service_name> | grep -v grep
if [[ $? != 0 ]]; then
/etc/init.d/<service_name> start
fi
我做了一些思考,认为这可能不那么麻烦,而是一种使用 init 脚本的一般功能来检查它的方法:
/etc/init.d/<service_name> status
if [[ $? != 0 ]]; then
/etc/init.d/<service_name> start
fi
如果我错了,请纠正我,但这不是总是有效吗?这是 init 脚本的一般属性吗?它们返回退出代码?提前致谢。 :)
答案1
不是100%的时间。然而,这是一个非常好的衡量标准。
CFEngine 3 在“服务承诺”中使用它来检查服务是否正在运行。如果 的退出代码/etc/init.d/<servicename> status
为零,则假定该服务正在运行。
我刚刚遇到 BitBucket 不遵守此约定的情况:/etc/init.d/atlbitbucket status
即使未运行也返回 0。但是,我认为这是 init 脚本中的不良行为(错误),它不遵循约定。
找到了它的参考;这Linux 标准基本规范状态:
如果请求状态操作,初始化脚本将返回以下退出状态代码。
0 program is running or service is OK 1 program is dead and /var/run pid file exists 2 program is dead and /var/lock lock file exists 3 program is not running 4 program or service status is unknown 5-99 reserved for future LSB use 100-149 reserved for distribution use 150-199 reserved for application use 200-254 reserved
所以是的,合规的可以指望应用程序以这种方式运行。