有人能帮我在 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 号并且是工作日:
则运行作业,否则正常退出如果今天是 13 号并且是星期一:(
那么 12号是星期日并且不允许运行该作业)
则运行该作业,否则正常退出如果今天是 14号并且是星期一:(
那么 12号是星期六并且不允许运行该作业)
则运行该作业,否则正常退出
你的/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