![Bash 脚本的 Cronjob 随机暂停 2 分钟](https://linux22.com/image/642245/Bash%20%E8%84%9A%E6%9C%AC%E7%9A%84%20Cronjob%20%E9%9A%8F%E6%9C%BA%E6%9A%82%E5%81%9C%202%20%E5%88%86%E9%92%9F.png)
我一直在 CEntOS 5.5 机器上运行一个 bash 脚本,用于检查远程 mysql 服务器上的复制。该脚本会创建一个临时锁定文件,并计划每分钟在 Crontab 中运行一次。但偶尔,cron 作业会不同步 - 暂停或延迟作业两分钟,并尝试一次运行三个作业。这会产生误报,我的邮箱里会充斥着“锁定文件存在!可能存在冲突”。
以下是脚本中您可能感兴趣的部分:
#!/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 被延迟了。
让我们将此字符串命名为 CRONJOB = (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
答案1
Cron 实际上并不保证执行时间。它采用“尽力而为”模型。尽管它希望每分钟运行一次,但它会尽力而为,但有时(由于各种与资源相关的原因)可能会决定它当时无法完成,并可能将其推迟到下一个周期。
此外,Cron 甚至不能保证它会按照 crontab 中显示的顺序运行项目。虽然这种情况比较少见,但您肯定会遇到作业无序运行或与其他作业重复运行的情况(这很可能就是您在此处看到的情况)。
您可能并不真正关心您的复制检查是否会滞后一两分钟(尽管这实际上由您决定)。在我管理的高流量环境中,我们仅通过 cron 每 30 分钟执行一次复制检查。
也就是说,如果您绝对需要精确地执行这些任务,您可能需要研究与 Cron 不同的解决方案。