Shell

如何在第 2 周和第 3 週以及一周中的特定日期安排 cron?

  • May 22, 2021

我正在嘗試安排一個 cron,如果一個月有 5 周和 5 個星期三,腳本A.sh應該在第 1 周星期三第 2 周星期三、第 3 周星期三和第 4 周星期三執行,而在第 5 周星期三它應該執行b.sh

別的

我正在嘗試安排一個 cron,如果一個月有 4 周和 4 個星期三,腳本A.sh應該在第 1 周星期三、第 2 周星期三、第 3 周星期三執行,而它應該在第 4 周星期三執行b.sh

原始問題的原始答案。

你需要這樣的東西:

0 1 1-21 * * [ $(date +\%u) -eq 3 ] && "call your command/script here"

這個計劃0 1 1-21 * *意味著在每月的每一天從 1 到 21 的上午 01:00 執行作業;現在的問題是為什麼我們限制在 1 到 21?答案是因為在最好的情況下,一個月的 1 天已經從周三開始(所以我們選擇了1),crontab 將在每月的 1日、8日和 15日執行;

在最壞的情況下,這將是第一周的最後一天(第 7 天),因此 crontab 將在每月的第 7天、第14天和第21天執行;這就是為什麼我們將執行天數限制為一個月的 1~21 天。

但接著man -s 5 crontab說:

注意:命令執行的日期可以由兩個欄位指定 - 月中的日和周中的日。如果兩個欄位都受限制(即不以 * 開頭),則在e̲i̲t̲h̲e̲r̲欄位與目前時間匹配時執行命令。

這就是為什麼我們只選擇 day-of-month 並將 * for day-of-week 的原因:

crontab-job

我們沒有像上面指出的那樣在 crontab 中指定星期幾,而是*test通過 shell*使用[ $(date +\%u) -eq 3 ];來處理這個問題。這將檢查星期幾是否是一周的第三天,即是否是星期三;(0-6 的星期幾,0 Mon, …., 6 Sun)然後執行命令/腳本。


回答現在修訂的問題。

0 1 * * 3 [ $(date +\%m) -eq $(date -d'+7days' +\%m) ] && scriptA.sh || scriptB.sh

如果不是最後一個星期三 ( [ $(date +\%m) -eq $(date -d'+7days' +\%m) ],我們正在檢查,今天的星期三月份$(date +\%m)+7 天后 (下星期三月份$(date -d'+7days' +\%m)) 是否在同一個月,所以它不是最後一個星期三,那麼 scripA.sh 將被執行,否則是最後一個星期三, scriptB.sh 將被執行。

如上所述,scriptA.sh 將在每月的每個星期三執行,除了最後一個星期三,然後 scriptB.sh 將被執行。

當然可以在腳本中移動這些測試$$ AB $$.sh 而不是在 crontab 條目中使事情複雜化。

引用自:https://unix.stackexchange.com/questions/650847