我的用户 crontab 有问题。
Crontab 拒绝运行任何作业,除非它被安排为每分钟运行一次 (* * * * *)。
一旦您将任务编辑为在每小时的 15 分钟运行,它就无法运行。
每分钟运行正常:
* * * * * touch /tmp/test01
它无法在每小时的 15 分钟运行。它只是不会运行。
15 * * * * touch /tmp/test02
- 这是什么原因造成的?
- 怎么解决呢?
操作系统是RedHat 4。
crontab -e
我总是用和EDITOR
设置为 vi编辑 cron 。我在15 * * * *
(分钟可以改变) 和之间来回更改,* * * * *
结果是相同的。它只喜欢五个星号。
巨大的编辑:
我跟着@shane-h的问题并进行了测试*/2 * * * *
(每隔一分钟)并且它有效!然后我发现了一些有启发性的事情:
我用这个字符串做了一个测试37 * * * * touch /tmp/prueba_777777
令我惊讶的是,事情实际上运行了,但看看文件的日期:
-rw-r--r-- 1 orashut dba 0 八月 8 08:07 prueba_777777
最近服务器被设置为新的委内瑞拉时区,现在是-04:00,但以前是-04:30。
当您运行 date 命令时,它会显示正确的日期。创建文件时,FS 中的文件日期是正确的。但不知何故,cron 作业提前了 30 分钟运行。这就是为什么当我在未来几分钟安排一项工作时它不起作用,因为对于 cron 守护进程来说,时间已经过去了。如果我等了将近一个小时,它就会在 30 分钟内运行。这就是为什么所触及的文件比计划的 37 分钟早了 30 分钟。
所以现在的问题是:
很明显,cron 守护进程正在使用旧时区,而服务器的其余部分正在使用新时区。
如何修复 cron 守护进程对新时区的理解?
答案1
所以现在的问题是:
很明显,cron 守护进程正在使用旧时区,而服务器的其余部分正在使用新时区。
如何修复 cron 守护进程对新时区的理解?
我的猜测是时区数据更新包已安装(tzdata
RPM或类似),但服务器尚未重新启动并且crond
守护程序在更新后尚未重新启动,因此crond
仍在使用最初启动时加载的旧时区数据。
如果这是问题所在,那么重新启动守护进程应该可以解决问题,正如 Shane H 评论的那样:service crond restart
或者/etc/init.d/crond restart
应该这样做。您还应该考虑重新启动任何其他可能记录时间戳的长时间运行的系统守护程序,例如sendmail
.
答案2
我无法给你一个具体的答案,但我将如何解决这个问题:
尝试更多的组合来找到另一种有效的表达方式。怎么样:(
*/2 * * * *
每隔一分钟),或者* */2 * * *
(每隔一分钟,每隔一小时)。确定任何相对的表达式有效,而固定表达式则无效。保存时,您是否会看到确认消息“已安装新的 crontab?” (或类似的东西)
您可以
crontab -l
查看您的留言吗?这是用户 crontab 还是系统 crontab?
您在系统日志中看到消息吗?如果您添加第二个
* * * * *
cron,您应该每分钟都会看到一次,如果您添加每隔一分钟的变体,您能在 syslog 中看到更频繁的作业吗?你能配置一个工作
at
命令吗?当你弄清楚这一点后,我建议使用我构建的服务,https://cronitor.io关注您的重要工作。开发人员可以免费监控一项工作,并且有商业用途的付费计划。多年来,我已经成为一名 cron 调试专家,并且知道如果我需要一个解决方案来监控我的重要工作,其他人可能也会这样做。
来自评论:
Cron 使用相同的系统时区来启动作业,所以我会尝试重置它:
再次设置您的时区,只是为了彻底:在 Red Hat 使用上
redhat-config-date
重新启动 cron 守护进程。我认为你的操作系统版本:
/etc/init.d/crond restart