Bash
bash 腳本的 Cronjob 隨機暫停 2 分鐘
我一直在 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!" mail@mail.com } # 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
Cron 實際上並不保證執行時間。它適用於“盡力而為”模型。儘管它希望它每分鐘執行一次,但它會盡可能地嘗試這樣做,但可能會每隔一段時間(由於各種與資源相關的原因)決定它無法做到這一點時刻,並可能將其推至下一個週期。
此外,Cron 甚至不保證它會按照它們在 crontab 中顯示的確切順序執行項目。儘管這種情況比較少見,但您肯定會遇到工作亂七八糟的情況,或者與其他工作重疊(這很可能就是您在此處看到的情況)。
您可能並不真正關心您的複制檢查是否會滯後一兩分鐘(儘管這確實是您的決定)。在我管理的高流量環境中,我們僅通過 cron 每 30 分鐘執行一次複製檢查。
就是說,如果您絕對必須具有精確度才能解僱這些工作,您可能會想要研究與 Cron 不同的解決方案。