![Cronjob 仅在其他程序已运行时运行程序](https://linux22.com/image/1163458/Cronjob%20%E4%BB%85%E5%9C%A8%E5%85%B6%E4%BB%96%E7%A8%8B%E5%BA%8F%E5%B7%B2%E8%BF%90%E8%A1%8C%E6%97%B6%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F.png)
如何仅当另一项服务已启动且程序本身尚未运行时运行 cronjob?重要的是,programm2 仅在 programm1 已启动后启动。
*/2 * * * * 检查 programm1 是否正在运行;检查 programm2 是否未运行;/etc/init.d programm2 start
答案1
您可以使用变量编写脚本$?
。此变量包含最后一个程序的退出状态;因此,如果您运行systemctl status dnsmasq
并且它处于活动状态,则运行echo $?
将返回0
,这意味着 true。如果它不处于活动状态,$?
将返回非 0 答案,这意味着 false。
实现此功能的一个简单脚本是:
#/!bin/bash
x=1
while [ "$x" != "0" ]
do
systemctl status (service to monitor)
if [ "$?" = "0" ]
then
systemctl start (service to start)
break
else
sleep 30
continue
fi
done
第 1 行 = 将变量设置为非零,以便可以从中运行循环
第 2 行 = 启动一个连续运行的循环(x 永远不能 = 0)
第 4 行 = 检查服务是否正在运行,设置$?
为零或非零值
第 5 行开始 = 检查上一个命令的退出状态(检查服务是否正在运行)是真还是假。如果为真(零),则启动下一个服务并跳出循环。如果为假(非零),则返回循环的开始处并运行,直到所选服务正在运行。
您可以在启动时运行该脚本,也可以将其转变为自己的服务。
由于您正在启动/停止系统服务,因此您需要以 root 身份运行它(无论您选择哪种方式)。