我一直在CEntOS 5.5机器上运行一个bash脚本,它检查远程mysql服务器上的复制。 该脚本创build一个临时locking文件,并计划每隔一分钟在Crontab中运行。 但是偶尔,cron工作不同步 – 暂停或延迟两分钟的工作,并尝试一次运行三个工作。 这是造成虚假警报,洪水我的邮箱说:“locking文件存在!可能的冲突”。
以下是可能感兴趣的脚本部分:
#!/bin/sh lock_file=/tmp/slave_alert.lck finished=0 # Alert function function mail_alert () { cat /var/log/replication_check.log | mail -s "Replication check errors!" [email protected] } # Check if lock file exists if [ -f $lock_file ]; then echo "Lock file exists! Possible conflict!" > /var/log/replication_check.log 2>&1 mail_alert exit 1 else touch $lock_file fi finished=1 while [ $finished -ne 0 ] do if [Replication is not configured or you do not have the required access to MySQL]; then rm $lock_file exit 1 fi # Do some logic sleep 1 done rm $lock_file echo "Script complete!" exit 0
这是Cronjob:
* 0-1,4-23 * * * path/check_replication.sh > /dev/null 2>&1
以下是日志文件输出的一部分:/ var / log / cron。 我们可以看到14:35和14:36被推迟。
让我们命名这个stringCRONJOB =(root)CMD(path / check_replication.sh> / dev / null 2>&1)
Sep 23 14:30:01 remote-host crond[3959]: CRONJOB Sep 23 14:31:01 remote-host crond[4025]: CRONJOB Sep 23 14:32:01 remote-host crond[4054]: CRONJOB Sep 23 14:33:01 remote-host crond[4102]: CRONJOB Sep 23 14:34:01 remote-host crond[4129]: CRONJOB Sep 23 14:37:00 remote-host crond[4276]: CRONJOB Sep 23 14:37:01 remote-host crond[4308]: CRONJOB Sep 23 14:37:02 remote-host crond[4365]: CRONJOB Sep 23 14:38:01 remote-host crond[4129]: CRONJOB Sep 23 14:39:01 remote-host crond[4129]: CRONJOB
Cron实际上并不保证执行时间。 它以“尽力而为”的模式运作。 虽然它希望每分钟运行一次,但它会尽可能地努力,但可能会每隔一段时间(由于各种与资源有关的原因)决定,它不能达到那个目的时刻,并可能将其推向下一个周期。
另外,Cron甚至不保证它会按照它们在crontab中显示的顺序运行项目。 虽然看起来更难得一见,但是你肯定可以把工作搞乱,或者把其他工作加倍(这可能就是你所看到的)。
你可能不太在乎你的复制检查是否会延迟一分钟或者两分钟(尽pipe那真的是你的呼叫)。 在我pipe理的高stream量环境中,我们只通过cron每30分钟执行复制检查。
也就是说,如果你绝对必须有精准的时间才能解雇这些工作,那么你可能会想看看Cron不同的解决scheme。