我怎麼能寫一個排除特定日期的 cron?
假設:我需要在週末每 30 分鐘執行一次 crontab,從下午 6 點到晚上 9 點,只想排除 2014 年 5 月 10 日。
是否可以?我該怎麼寫這篇?或有什麼替代方案嗎?請建議。
答案1
標準 cron 語法非常簡單,它不支援排除。在某些情況下,可以建立幾個/多個 cron 條目的清單來實現此類邏輯,但這往往很乏味且難以理解或維護;不過,這種方法不適用於您的情況(尤其是因為標準 cron 沒有日曆年的概念)。
讓 cron 命令變得複雜並不是一個好計劃,但是您可以使用相對簡單的方法來做到這一點,例如:
0,30 18-20 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
0 21 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
(使用“ 0,30 18-21
”,任務也將在 21:30 運行;如果您希望也在 21:00 運行,則需要第二行,如果不是,則忽略它)
注意:在一些crontab你必須轉義百分號(它們用於在將內聯資料填充到命令的標準輸入中時指示換行符),儘管不在 Dillon 的 cron 中。
cron 指令其實是一個 shell命令列表,||
控制算子提供短路評估命令。清單中的命令從左到右一次嘗試一個,但當第一個命令傳回 true 時停止執行。如果日期字串比較傳回 true(僅一天為 true)mycommand
則不運行,當日期比較傳回 false 時mycommand
運行。
但請注意,cron 啟動程序的方式有很多不同。最可靠的方法是使用包裝腳本來實現條件邏輯。
答案2
您可以用於X-Y
時間間隔和*/Z
頻率。在哪裡:
X
是間隔的開始。Y
是間隔的結束。Z
只是一個除數(即:每個Z
)。
為了排除某個日期,我只需建立自己的腳本。在此腳本中,檢查日期,然後決定是否要執行下列指令。