我有一台 ubuntu 服务器,我将应用程序核心放在其中。它是一个需要始终监听请求的 jar。我编写了一个脚本,使用正确的参数来运行它。
场景类似这样:脚本位置:/home/andrea/core/script.sh
script.sh 接受一个参数“start”或“stop”,具体取决于我需要做什么。
因为我需要它处于活动状态,所以我创建了一个 cron 作业来检查它是否处于活动状态,如果不存在,则使用以下命令重新启动它:
crontab -e
*/5 * * * * /home/andrea/core/testscriptalive.sh
其中 testscriptalive.sh 是:#!/bin/bash
# Check if core is running
if [ ! -f /tmp/core.pid ]; then
cd /home/andrea/core/
./script.sh start
./email.sh
fi
因此,每 5 分钟 cron 运行一次脚本“testscriptalive.sh”,它基本上会检查是否有正确的 PID,如果没有,它会重新启动核心并向我发送电子邮件。到目前为止一切顺利。我需要做的是:如果我想出于 X 原因停止核心,我该如何停止 cron 作业的执行而不手动编辑它?例如,如果我在控制台中输入“./script stop”,5 分钟后 cron 作业会自动重新启动它,即使我不想。我需要两个 sh 脚本来耦合到我的“start”和“stop”参数:
开始:
checks if the job is correctly stored in cron, if not adds it
停止:
removes the job from cron
我怎样才能实现这个目标?
谢谢
答案1
一个想法是创建几个包含 cron 作业的文本文件。一个包含 cron 作业的常规列表,另一个包含常规列表和此作业。然后,您可以从文本文件中加载 crontab。
crontab /path/to/MyCronJobs.txt
这将用文本文件中的作业覆盖 crontab。
答案2
您需要在停止程序中添加检查script.sh
:如果script.sh
从 shell(不是 cron)运行 --> 创建一些/tmp/stop.tmp
文件,并在启动程序中删除此文件。
所以testscriptalive.sh
还需要检查是否/tmp/stop.tmp
存在......
答案3
我发现对于此类需求的最佳解决方案是使用以下方法为所有此类脚本添加锁定:
if [[ -f "/tmp/$0.lock" ]]; then
echo "$0 is locked. Bailing."
exit 0
else
touch "/tmp/$0.lock"
fi
# the rest of the script goes here
rm -f "/tmp/$0.lock"
一旦将其添加到我的脚本中,touch /tmp/scriptname.lock
当我想阻止 cron 作业运行时,我可以手动放置锁定文件 - cron 仍会触发脚本,但脚本将看到其锁定文件并中止。