2013-05-02 55 views
0

基本上,我有一系列命令我想運行其他星期日。我設置了一個cron任務來在每個星期日運行這個腳本,然後這個腳本只允許腳本運行幾周,因此它只能在其他星期日運行。我的問題是,這個劇本會不會每年都在進行。這段代碼會在新的一年中工作嗎?

if [ $(($(date +'%U') % 2)) -eq 0 ] 
then 
    some command 
fi 
+4

您是否嘗試過測試它?你知道你可以改變計算機上的時鐘來模擬這個。 – JohnFx 2013-05-02 02:36:05

+1

您不必更改時鐘。你可以使用'-d'指定一個日期。 – paddy 2013-05-02 02:38:55

+0

您可以直接在cron中寫上「隔兩週」。看[這裏有幾種方法](http://stackoverflow.com/questions/350047/how-to-instruct-cron-to-execute-a-job-every-second-week) – 2013-05-02 02:45:46

回答

2

您在這裏有所謂的the XY problem

您的shell腳本的這一部分有問題,並且您想通過修復腳本來解決問題。事實上,解決問題的根本原因更容易。

簡單地改變你的cron作業運行每其他星期日:

#----+-----+-----+-----+-----+------------------------------------------------- 
#min |hour |day |month|day |command 
# |  |of mn|  |of wk| 
#----+-----+-----+-----+-----+------------------------------------------------- 
03 04 *  *  7  expr `date +%W` % 2 >/dev/null || fortnightly.sh 

更多信息,請參見How to instruct cron to execute a job every second week?

1

如果您不想使用cron語法指定此語法,則可以使用%s格式而不是%U。這會給你自1970年1月1日UTC以來的秒數。你可以把它分成一個星期的數字:

$(($(date +'%s')/604800)) 

然後,你可以做你的模測試。

注意編號604800 = 7 * 86400 = 7 * 24 * 60 * 60一週內的秒數。

如果你每天都在運行,你會想知道它實際上是一個星期天。所以在這種情況下,你會除以86400來獲得一個天數。然後,知道第零天是星期四,您可以檢查結果(模14)是3還是10,具體取決於您開始的哪個星期日。