每天而不是每月执行的 crontab 作业
Posted
技术标签:
【中文标题】每天而不是每月执行的 crontab 作业【英文标题】:Crontab job executed every day instead every month 【发布时间】:2015-09-26 12:57:03 【问题描述】:三天前,我使用 crontab -e 安装了以下 crontab 作业:
# execute weekly
0 2 2-31 * 7 sh /home/user/folder/myscript.sh week > /home/user/.crontablog/crontab.log
它应该在每个星期日的凌晨 2 点执行,除了每月的 1 号。然而,它每晚凌晨 2 点执行。我的错误是什么?我在周日尝试了 0 而不是 7,结果相同:/
谢谢。
【问题讨论】:
周日试试0
,而不是7
?
为什么指定2-21
为当天?如果每月的第一天是星期天,它似乎不会运行。
史蒂夫·萨米特,谢谢。我刚刚编辑了帖子说我已经尝试了 0 没有成功。
我想您希望0 2 * * 7
在每周日凌晨 2:00 运行。 7 和 0 是等价的。 (是的,我在每周一次的工作中使用类似的东西。)
2-31 因为我还有另一个工作要在本月 1 日执行,所以可以避开第 1 天。
【参考方案1】:
如果您想在每个星期日的凌晨 2 点运行脚本,但前提是它不是当月的第一天,那么您必须使用以下语法:
0 2 * * 0 /usr/bin/test $(/bin/date +\%e) -ne 1 && your_command
test
utilliy 最后检查它是否是一个月的第一天,your_command
只有在不是时才被执行。
【讨论】:
【参考方案2】:由于crontab的格式是这样的:
+---------------- minute (0 - 59)
| +------------- hour (0 - 23)
| | +---------- day of month (1 - 31)
| | | +------- month (1 - 12)
| | | | +---- day of week (0 - 6) (Sunday=0 or 7)
| | | | |
* * * * * command to be executed
要在每周日执行它,而不考虑月份,你需要这样写:
0 2 * * 7 sh /home/user/folder/myscript.sh week > /home/user/.crontablog/crontab.log
【讨论】:
【参考方案3】:现在您在 cmets 中重新指定了您的问题,您需要做两件事:
如上所述,使用0 2 * * 7 to run at 2:00am every Sunday
; 7和0是等价的
在您的 shell 脚本中使用额外的测试在月初悄悄退出。
这个测试可以很简单
test $(date +%d) == "01" && exit
但您当然也可以将其设为适当的 if ...
,并添加更多 echo
和冗长。
【讨论】:
【参考方案4】:首先你可以分析/var/log/cron的内容,grepping你的脚本看看发生了什么。
我建议你使用以下语法
0 2 * * sun /home/user/folder/myscript.sh week
已授予脚本文件的 +x 权限。 干杯
【讨论】:
今晚我试过这个语法,效果很好。但是,我会尝试混乱提出的解决方案,因为我想避免在本月 1 日执行。以上是关于每天而不是每月执行的 crontab 作业的主要内容,如果未能解决你的问题,请参考以下文章