Назад | Перейти на главную страницу

Cronjob для сценария bash останавливается на 2 минуты случайным образом

Я запускал сценарий bash на машине CEntOS 5.5, который проверяет репликацию на удаленном сервере 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. Хотя это немного реже, вы определенно можете получить задания, которые выходят из строя или удваиваются с другими заданиями (что вполне может быть тем, что вы здесь видите).

Вероятно, вам все равно, будет ли ваша проверка репликации задерживаться на минуту или две (хотя это действительно будет ваш выбор). В среде с высоким трафиком, которой я управляю, мы выполняем проверки репликации только каждые 30 минут через cron.

Тем не менее, если вам абсолютно необходима минимальная точность для выполнения этих заданий, вы, вероятно, захотите изучить другое решение, отличное от Cron.