2012-02-04 59 views
1

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

+0

请参见[流程管理](http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at_a_time)。 – 2012-02-04 15:03:28

回答

1
  1. 请确保您具有唯一的脚本名称。
  2. 然后检查6个实例已经运行

    if [ $(pgrep '^UNIQUE_SCIPT_NAME$' -c) -lt 6 ] 
    then 
        # start my script 
    else 
        # do not start my script 
    fi 
    
1

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

这样,您也可以更容易地控制您的峰值和非峰值延迟,如您所愿。如果脚本在最后一次启动时发现了某些内容,或者如果它没有找到任何内容,则延迟时间会更长一些,如​​果简单地使用较短的延迟将会相当优雅。

+0

嗯...我喜欢这种基于成功的延迟的想法...将不得不尝试 – mondo 2012-02-04 00:30:06

0

你可以使用脚本像OneAtATime谨防多个同时执行。

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部分:我将输出管道输出到一个日志文件中,其名称部分包含脚本名称,所以这样我就可以避免它被重复计数。