2009-10-21 69 views
0

我有一個bash腳本,每天通過cron運行。bash:每x天做一份工作

在這個慶典我要運行一些命令,但只有每x天(x爲固定的,將3,4或5,我不知道此刻)

我可以測試的剩餘部分的月/ X等於0

DAY_OF_MONTH%分割天x = 0

我將工作在單個一個月,但並不之間總是一個月,例如幾個月四月 - 可以具有x = 3

1 2 3 4 5 6 7 8 9 ... 27 28 29 30 31 1 2 3 4 5 6 7 8 9 ... 27 28 29 30 
    x  x  x ... x  x  x  x  x ... x  x 

這不是什麼大不了的事,但是有沒有其他辦法可以做到這一點?

PS:我不希望我的爆炸劇本,使2個cron作業(每天一個:*,其他evevery X日:*/X)

回答

6

一個簡單的解決方案是使用「一年中的某天」而不是一天中的某一天。那麼不同的月份長度就沒有問題了。當然,你在年底仍然會遇到問題。 「年的一天」可通過date +%j獲取。

如果仍然不能接受,可以使用1970年以來的秒數(date +%s),除以天數* 24 * 60 * 60,然後使用其餘部分。您仍然遇到leap seconds的問題,但否則應該是正確的。

+0

好主意,謝謝 – voidAndAny 2009-10-21 10:42:45

+0

+1提閏秒:) – retracile 2009-10-21 13:54:33

1

我將出口與最後日期的系統變量執行並計算它的間隔。重啓後它不會工作,但我認爲在這種情況下應該恢復間隔。

+0

該變量不會在'cron'作業的後續運行中看到。出口工作與兒童,而不是父母。但是,您可以將日期放在'/ var/run'文件中,然後讀取它以控制執行。這也可以在重啓後倖存下來。 – 2009-10-21 13:01:43

2

使用cron實際上聽起來像是正確的想法,因爲這是cron的目的。

解決你的'跨月問題'的一個主意:不要在幾個月內想,而是檢查時間以秒爲單位的時間是否爲0 ...

0

您的工作是否需要每天運行?也就是說,它做的那些日子裏的東西時,你的計算不以0的結果,如果沒有,你可以設置在cron作業這樣的:

0 12 3,6,9,12,15,18,21,24,27,30 * * <your job> 

,它會運行每三天(12中午在我的例子)。

我敢肯定,「2月30日」將被安全地忽略。

+0

是的,我的bash腳本需要每天運行 – voidAndAny 2009-10-21 10:41:50

1

看一看在at command

使用,你可以告訴腳本調用自身在稍後的日期。

從手冊頁:

例如,在從現在開始下午4點3 天運行作業,你會做在 下午4 + 3天,在上午10:00 7月31日以運行作業,你會在 上午10點 7月31日做,明天凌晨1點運行一個工作,明天你會在凌晨1點執行 。

1

如果我有這個問題,我會告訴cron每天運行腳本一次,並在腳本內部計算是否需要完成工作。這樣,你可以完全控制它。

例如,

dayno=`date +%d` 
let divided=daynum%3 
if [ $divided == 0 ] ; then 
    exit 0 
fi 
# real work begins here 

這個腳本會使用bash的任何系統上運行。