我想每分钟运行一个启动脚本的cron作业。那里很简单。但是,我需要确保实例中的X号(在脚本中定义)不超过运行。这些是队列工作者,因此如果在任何时间间隔6个工作者仍处于活动状态,那么我将不会启动另一个实例。该脚本只是启动一个PHP脚本,如果没有可用的作业,它将退出。现在我有一个shell脚本,它在退出后每隔10秒就会永久启动...但是有很长一段时间没有工作,并且一分钟延迟就可以了。最终,我希望在峰值和非峰值时有两个cron作业,间隔不同。
答案 0 :(得分:1)
我想说如果你想每分钟迭代一次,那么像你当前重新启动自身的shell脚本这样的过程就是你真正想做的事情。只需将延迟时间从10秒增加到1分钟即可。
这样,您也可以根据需要更轻松地控制峰值和非峰值延迟。如果脚本在上次启动时发现了某些事情,那么简单地使用较短的延迟会相当优雅,如果它没有找到任何东西则会延迟更长的延迟。
答案 1 :(得分:1)
然后检查是否有6个实例正在运行
if [ $(pgrep '^UNIQUE_SCIPT_NAME$' -c) -lt 6 ]
then
# start my script
else
# do not start my script
fi
答案 2 :(得分:0)
您可以使用OneAtATime之类的脚本来防止多个同时执行。
答案 3 :(得分:0)
这就是我在shell脚本中使用的内容:
echo -n "Checking if job is already running... "
me=`basename $0`
running=$(ps aux | grep ${me} | grep -v .log | grep -v grep | wc -l)
if [ $running -gt 1 ];
then
echo "already running, stopping job"
exit 1
else
echo "OK."
fi;
您要查找的命令在第3行。只需用您的php脚本名称替换$(me)
即可。如果您想知道grep .log
部分:我正在将输出汇总到一个日志文件中,其名称部分包含脚本名称,所以这样我就可以避免它被重复计算。