![在每個月的第一個星期一執行 cron 作業?](https://rvso.com/image/1316111/%E5%9C%A8%E6%AF%8F%E5%80%8B%E6%9C%88%E7%9A%84%E7%AC%AC%E4%B8%80%E5%80%8B%E6%98%9F%E6%9C%9F%E4%B8%80%E5%9F%B7%E8%A1%8C%20cron%20%E4%BD%9C%E6%A5%AD%EF%BC%9F.png)
我想在每個月的第一個星期一 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