
誰能幫我在 crontab 上安排一項工作,該工作將在每月 12 日運行,如果 12 日是周末,則應在下週一運行。
我從互聯網上找到了一些東西,但它不起作用
0 0 12 * * [ "$(date +%d -d tomorrow)" == "12" ] && [ "$(date +%u -d 12th)" -gt 5 ] && your-command
這就是 ChatGPT 給我的。我不知道如何調試這個
答案1
我的一般建議是,當您無法使用 cron 提供的有限語法簡單地格式化您的計劃時,您不應該嘗試建立一個非常複雜的 cron 命令。
作為解決方法:比您需要的更頻繁地運行計劃,然後在您的批次作業或包裝器 shell 腳本中,您擁有更豐富的環境,您可以應用“複雜的「您需要的邏輯。如果允許批次運行,則執行作業,否則正常退出。
例子
在 cron 中,安排批次從始終在第 12、13 和 14 天運行的包裝腳本運行,或允許它每天運行。
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
25 4 12,13,14 * * /path/to/your/wrapper.script
# or even:
25 4 * * * /path/to/your/wrapper.script
然後在該包裝器 shell 腳本中套用邏輯:
如果今天是 12 號且是工作日:
執行作業 ELSE 正常退出IF 今天是 13 號且是星期一:(
那麼 12號是星期日且作業不允許執行)
運行作業 ELSE 正常退出IF 今天是 14 號且是星期一:(
那麼 12號是星期六且作業不允許執行)
運行作業 ELSE 正常退出
您的/path/to/your/wrapper.script
bash 腳本可能如下所示:
#!/bin/bash
# Wrapper script that will run_batch() on the 12th when
# the 12th is a weekday, otherwise the following Monday
run_batch () {
# Add the real job here
echo "The job has started"
}
TODAY=$(date +%d)
# date +%u day of week (1..7); 1 is Monday
WEEKDAY=$(date +%u)
if [ "${TODAY}" -eq 12 ] && [ "${WEEKDAY}" -le 5 ] ; then
run_batch
elif [ "${TODAY}" -eq 13 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
elif [ "${TODAY}" -eq 14 ] && [ "${WEEKDAY}" -eq 1 ] ; then
run_batch
else
exit
fi