Bash

bash 腳本的 Cronjob 隨機暫停 2 分鐘

  • September 24, 2014

我一直在 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 不同的解決方案。

引用自:https://serverfault.com/questions/630697