每天而不是每月执行的 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 作业的主要内容,如果未能解决你的问题,请参考以下文章

linux使用cron怎么设置定时任务

CRONTAB

cron定时表达式

lunux定时任务

crontab 每月执行一次怎么写

如何每 72 分钟执行一次 cron 任务