cron作业偶尔不运行


8

我有一台CentOS 6.6装有以下软件包的服务器:

crontabs-1.10-33.el6.noarch
cronie-1.4.4-12.el6.x86_64
cronie-anacron-1.4.4-12.el6.x86_64
kernel-2.6.32-504.3.3.el6.x86_64

有时,计划每天运行的备份作业之一根本无法运行。甚至没有根据调用脚本/var/log/cron.log。有趣的是,其他计划完全在同一时间运行的作业没有任何问题。

我无法重现该问题,也没有发现任何模式。如果我什么也不做,则该工作将按预期第二天正确运行。

crond只是忽略了应该在特定时间运行的多个作业之一。这只是偶尔发生。

我在其他一些地方读过,人们谈论在crontab文件末尾添加一个空行。偶尔无法运行的作业确实在crontab文件的最后一行。我找不到任何确认,这是一个真实的或已知的错误。

# tail -2 /var/spool/cron/postgres
*  * * * * OTHERJOB
0 21 * * * /pg_backup.sh

这就是我的全部 /var/log/cron.log

Mar 31 21:00:02 SERVERNAME [cron.info] CROND[19394]: (root) CMD (OTHERJOB)
Mar 31 21:00:02 SERVERNAME [cron.info] CROND[19418]: (postgres) CMD (/pg_backup.sh)
Mar 31 21:01:02 SERVERNAME [cron.info] CROND[20062]: (root) CMD (OTHERJOB)

Apr  1 21:00:02 SERVERNAME [cron.info] CROND[31349]: (root) CMD (OTHERJOB)
Apr  1 21:01:01 SERVERNAME [cron.info] CROND[32080]: (root) CMD (OTHERJOB)

了解即使OTHERJOB在开机状态Apr 1 pg_backup.sh下始终不运行的情况。

我已经尝试过重新启动,crond但是这种情况一直在发生。这会影响具有相同版本的OS,内核和cronRPM的多台服务器。

cronie1.4.12)有较新的版本,但是由于我们已经在使用最新的可用版本,因此无法升级Centos 6.6

我浏览了croniemine(1.4.4)之后所有版本的变更日志,并且似乎没有针对此特定问题的任何解决方法。还检查了所有提交消息


1
良好的故障排除。为什么不尝试在最后一行添加noop(echo >/dev/null例如)?
Belmin Fernandez

是否有任何命令抛出错误。它可能会停止脚本。我对init.d脚本有类似的经验。
hardik 2015年

每个作业完成的速度有多快?如果您每分钟开始的工作每次运行两分钟,则可能是一个问题。但是,如果在两秒钟内完成,则可能不是问题。
卡巴斯德(Kasperd)

1
每分钟运行的作业(OTHERJOB)在几秒钟内完成。但这不是问题。我只在上面的日志中添加了OTHERJOB,以显示crond正在运行,而OTHERJOB已被正确处理,而pg_backup.sh根本没有运行。
路易斯

检查/var/log/audit/audit.log
迈克尔·汉普顿

Answers:


6

原始cron要求每个条目都以换行符结尾,因此是的,有时您确实需要在末尾添加空白行或其他内容。

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

某些版本已修复该问题或发出警告,例如Ubuntu Maverik(10.10):crontab查看底部的诊断部分,其中指出将被写入syslog的警告。

DIAGNOSTICS
       cron requires that each entry in a crontab end in a newline  character.
       If  the last entry in a crontab is missing a newline (ie, terminated by
       EOF), cron will consider the crontab (at  least  partially)  broken.  A
       warning will be written to syslog. 

2

这是搜索文本附带的第一个答案,cron error getpwname failed因此我认为我应该发布问题的原因:

我正在使用/ etc / crontab,但是忘记将用户放在命令前面。

*/5   *  *  *  * /bin/bash <filename>

代替

 */5   *  *  *  * root /bin/bash <filename>

它给出了相同的错误,去看看。


1

我们sssd用于远程身份验证。crond必须在运行作业之前检查可用用户,并且每60秒检查一次。 sssd默认client_idle_timeout值为60秒。所以我们有一个竞争条件之间sssdcrond

我们只了解这个问题的1.4.4-14根源,因为在版本crond中,一些错误开始变得更加冗长。

* Thu Feb  5 12:00:00 2015 Tomáš Mráz <tmraz@redhat.com> - 1.4.4-14
- add log message when getpwnam fails

更新到该版本后,我们开始看到以下错误,同时作业无法运行:

[cron.err] crond[8654]: (user) ERROR (getpwnam() failed): Broken pipe

这使我们想到了:https : //bugzilla.redhat.com/show_bug.cgi?id=1209600#c2

最后是这个:https : //access.redhat.com/solutions/1125133

问题:sssd_be由于getpwnam()返回EPIPE(即管道损坏)而导致SIGKILL终止,可能导致crond默默跳过cron作业条目。

上面链接的建议解决方案是将以下行添加到/etc/sssd/sssd.conf

client_idle_timeout = 75

上面的更改为我们解决了这个问题,cron不再跳过工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.