2012-02-04 120 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部分:我將輸出管道輸出到一個日誌文件中,其名稱部分包含腳本名稱,所以這樣我就可以避免它被重複計數。