2012-03-12 66 views
2

我想讓cron作業在隔天運行......所以如果一個人今天運行,另一個人明天就會運行等等。我知道交替的cron作業問題

* * */2 * * command 

將運行每隔一天......但我需要通過無論抵消了一年,另一個是什麼日期...任何想法什麼的命令將在隔日運行?

+0

我剛剛結束了使用php,併爲每個進程寫了​​兩個腳本<?php date_default_timezone_set('UTC'); function get_current_day(){ $ then = mktime(0,0,0,1,1,'00'); $ now = time(); $ days =($ now - $ then)/ 86400 - 1; return(int)$ days; } $ i = get_current_day(); if(($ i%2)== 0) { echo「今天運行」; shell_exec('php /data/1.php'); } ?> – user1179295 2012-03-13 00:05:38

回答

0

下面是一個表達式,讓你自1/1/1970 00:00:00 UTC開始

if ((c=`date -d 3/13/2012 -u +%s`/86400 % 2 == 1)); then echo odd; else echo even; fi 

命令date -u +%s返回秒。 -u選項使它在開始和結束時間都使用UTC,所以結果與時區無關。然後它除以86400來計算天數,然後確定它是偶數還是奇數。對於odd,返回碼將爲0(shell tr​​ue),對於even,則返回碼爲1(shell false)。

這比其他解決方案具有優勢,它不會給你兩個在一個月或一年的邊界連續的平均數或賠率,因爲它從1970年1月1日算起,而不考慮幾年或幾個月。

請注意,這種方法並不完美。由於增加了偶爾的閏秒,這種方法可能在午夜幾秒鐘內做出錯誤的決定。

0

我知道兩種方式,這兩種方式都是以不同的方式醜陋。

有蠻力:

0 0 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30 * * command 
0 0 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * * command 

我沒有鍵入這些數字,所以感覺還好使用該解決方案。

然後是包裝腳本拒絕運行,除非在指定的日期。把這個/usr/local/bin/event,並符號鏈接到`在/ usr/local/bin目錄/奇

#!/bin/bash 

if [ "$(basename $0)" = "even" ]; then 
    EXIT_ON_MATCH=1 
else 
    EXIT_ON_MATCH=0 
fi 

if [ "$(expr $(($(date --utc +%s)/86400)) % 2)" = "$EXIT_ON_MATCH" ]; then 
    exit 1 
fi 

[email protected] 

然後做

0 0 * * * /usr/local/bin/even command 
0 0 * * * /usr/local/bin/odd command 

一些合理的時間更換0 0

+0

我向任何能夠將偶數/奇數腳本變成一行的任何人的開明精神提供一個禪弓。 – cmc 2012-03-12 22:44:32

0

您可以運行以下BASH單行命令作爲您的cron命令。我使用$ HOME/mycron作爲存儲要運行的下一個命令的編號的文件,但可以將其設置爲可由運行cron作業的用戶寫入的任何位置/文件。使用運行第二個和第一個命令的實際命令(是的,該命令是有意的)替換「echo」運行cmd1'「和」echo'運行cmd2'「部分。

0 6 * * * if [ -e $HOME/mycron ]; then WHICH=`cat $HOME/mycron`; if [ $WHICH -eq 2 ]; then echo 'run cmd2'; echo 1 > $HOME/mycron; else echo 'run cmd1'; echo 2 > $HOME/mycron; fi; fi 
+0

不明白爲什麼它不起作用,但我更喜歡無狀態,所以我不必擔心搞砸權限,滿磁盤等。另外,我建議將一個班輪放入腳本中。 – cmc 2012-03-12 23:12:27