Scripting

在每月的特定日期執行 cronjob,但如果那是在周末執行則更早

  • March 15, 2021

我有一個 cronjob,它在每月 20 日早上 6 點執行腳本:

0 6 20 * * /opt/example.sh

這按預期工作,但我想對此進行調整,因此如果 20 日是周六或週日,腳本會更早執行。例如:

該腳本計劃在 2021 年 2 月 20 日執行,但這是星期六,因此它在 19 日星期五執行。同樣,腳本計劃在 2022 年 2 月 20 日執行,但這是星期天,因此它在 18 日星期五執行。

我無法確定使用 cronjob 本身完成此任務的任何選項或技巧。我希望找到一些技巧來使用可用的替代單一值(即 crontab 中的星期日的 SUN)。

我認為這需要在腳本本身中實現。

例如,我可以在 18 日執行它並在腳本中延遲執行(睡眠),直到 20 日,除非到了周末。這對我來說似乎很容易出錯。或者,我的想法是安排在 18 日、19 日和 20 日執行,並檢查腳本中的日期,是否在我的意圖內執行。

有什麼方法可以用 cron 本身來實現嗎?

我將創建一個runsometimes.sh包含以下內容的腳本:

#!/bin/bash
if [ $(date +%d) -eq 18 && $(date +%A) == "Friday" ] ; then/opt/example.sh ; exit ; fi
if [ $(date +%d) -eq 19 && $(date +%A) == "Friday" ] ; then /opt/example.sh ; exit; fi
if [ $(date +%d) -eq 20 ] ; then /opt/example.sh ; fi

並確保 cron 每天對其進行測試:0 6 * * * runsometimes.sh

一些注意事項:

  • 我寫的腳本比它應該的長,您可以通過組合條件將其縮小為 1 個“if-then-fi”。我之所以這樣寫是因為它更容易閱讀
  • “好風格”規定我應該玩else而不是exit,但同樣:我認為這更容易閱讀
  • 我很快就寫了答案,沒有測試它,在你使用它之前測試它!
  • 我假設您的系統使用英語語言環境(再次使其更易於閱讀)。如果你想“正確”地做到這一點,請使用$(date +%u) -eq 5而不是$(date +%A) == Friday

編輯:我沒有閱讀整個問題,並且錯過了您想單獨使用 cron 來完成它。我怕這是不可能的……

您可以在 上執行它18,19,20並檢查目前日期,例如:

0 6 18,19,20 * * case $(LC_ALL=C date +\%a\%d) in (Sat*|Sun*);; (Fri18|Fri19|*20) /opt/example.sh; esac

允許 20 號,只要它既不是星期六也不是星期天,或者 18 號或 19 號,只要它們在星期五。

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