2017-03-01 36 views
0

我有一個cronjob,其最終目標是在每個月的第一個星期日進行數據庫備份(並刪除上一個月的備份)。我的cron工作應該只在星期天運行,但它也在其他時間運行?

這裏是我把它定義爲:

0 1 1-7 * * test `date +\%w` -eq 0 && rm /tmp/firstSundayBackup*; mysqldump -u user -ppassword database > /tmp/firstSundayBackup-`date +\%Y-\%m-\%d`.sql 

然而,在尋找我的/ tmp /文件夾,我會看到這些備份的日子,在第一週中不屬於週日的倍數。

不應該

test `date +\%w` -eq 0 && REST_OF_JOB 

從任何一天,這不是星期天停止運行的代碼?

回答

1

不應該

test `date +\%w` -eq 0 && REST_OF_JOB 

從任何一天,這不是星期天停止運行的代碼?

它的確如此,但由於運營商的優先級,這僅適用於rm命令。無論如何,mysqldump將繼續。

你可以簡單地通過將兩個命令周圍的括號解決這個問題,&&後:

test `date +\%w` -eq 0 && (rm /tmp/firstSundayBackup*; mysqldump -u user -ppassword database > /tmp/firstSundayBackup-`date +\%Y-\%m-\%d`.sql) 

作爲一個主要的旁白:你工作將每天跑步,因爲你告訴cron來運行它每一天。是否有充分理由說明你爲什麼要這樣做,然後試圖將大部分執行過程短路,而不是僅僅告訴克朗在週日運行它?這似乎是最直觀的方式來處理這一點,所以如果你計劃它作爲你會出問題:

0 1 1-7 * 0 
0

我認爲這是可以通過在cron的實現依靠的edge case實現這個不注日期的考驗。嘗試0 1 1-7 * */7REST_OF_JOB

相關問題