实例有限的cron工作

时间:2012-02-04 00:12:36

标签: linux bash cron

我想每分钟运行一个启动脚本的cron作业。那里很简单。但是,我需要确保实例中的X号(在脚本中定义)不超过运行。这些是队列工作者,因此如果在任何时间间隔6个工作者仍处于活动状态,那么我将不会启动另一个实例。该脚本只是启动一个PHP脚本,如果没有可用的作业,它将退出。现在我有一个shell脚本,它在退出后每隔10秒就会永久启动...但是有很长一段时间没有工作,并且一分钟延迟就可以了。最终,我希望在峰值和非峰值时有两个cron作业,间隔不同。

4 个答案:

答案 0 :(得分:1)

我想说如果你想每分钟迭代一次,那么像你当前重新启动自身的shell脚本这样的过程就是你真正想做的事情。只需将延迟时间从10秒增加到1分钟即可。

这样,您也可以根据需要更轻松地控制峰值和非峰值延迟。如果脚本在上次启动时发现了某些事情,那么简单地使用较短的延迟会相当优雅,如果它没有找到任何东西则会延迟更长的延迟。

答案 1 :(得分:1)

  1. 确保您拥有唯一的脚本名称。
  2. 然后检查是否有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部分:我正在将输出汇总到一个日志文件中,其名称部分包含脚本名称,所以这样我就可以避免它被重复计算。