在每個月的第一個星期一執行 cron 作業?

在每個月的第一個星期一執行 cron 作業?

我想在每個月的第一個星期一 8.30 從 cron 執行一個作業。 cron 維基百科頁面說

雖然通常當時間/日期規範欄位都與當前時間和日期相符時執行作業,但有一個例外:如果「月份中的某一天」和「星期幾」都受到限制(不是「*」),則任何一個「月份中的某一天」欄位 (3) 或「星期幾」欄位 (5) 必須與目前日期相符。

(我的重點)

這是否意味著我不能做這個月的第一個星期一,我只能做這個月的第一天(或其他)?我想不出解決辦法。

答案1

您可以將條件放入實際的 crontab 指令中(通用方式):

[ "$(date '+%u')" = "1" ] && echo "It's Monday"

如果您的區域設定是 EN/US,您也可以比較字串(初始答案):

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

現在,如果這個條件在一個月的前 7 天之一成立,那麼您就有了第一個星期一。請注意,在 crontab 中,百分比語法需要轉義(通用方式):

0   12  1-7 *   *   [ "$(date '+\%u')" = "1" ] && echo "It's Monday"

如果您的區域設定是 EN/US,您也可以比較字串(初始答案):

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

將命令替換echo為您要執行的實際命令。我找到了一個類似的方法也。

答案2

我的計算機的區域設置為西班牙語,因此,這種方法對我不起作用,因為週一更改為

其他語言也會失敗,因此,我對已接受的答案做了一些細微的改變,以消除語言障礙:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

答案3

我發現不需要處理天數時會更容易。

每月第一個星期一運行:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

即,如果 1 週前的月份與當前月份不同,則我們處於該月的第一天 1(= 星期一)。

同樣,第三個星期五

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

即,如果 3 週前的月份與目前月份不同,那麼我們處於該月的第 3 天 6(= 星期五)

答案4

我安排了一個作業在每個月的第四個星期一下午 4:00 運行,如下所示:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

相關內容