Безопасная перезагрузка задания cron с откатом на проблему сброса SysRq

Я пытаюсь настроить работу cron для ежедневной перезагрузки устройств. С безопасным обратным вызовом для сброса SysRq, если по какой-то причине перезагрузка действительно зависает (проблема в том, что SSH убивается, и устройство никогда не перезагружается, поэтому оно теряется и требует дорогостоящего вмешательства человека для перезапуска).

Скрипт, который работал некоторое время:

5 5 * * * root /sbin/reboot -f; sleep 30; /bin/echo `date -u +'\%Y-\%m-\%dT\%H:\%M:\%SZ'` >> /var/log/player-reboot.error.log; echo 1 > /proc/sys/kernel/sysrq; sync; echo b > /proc/sysrq-trigger

Однако это довольно жестоко (hard reboot -f), и некоторые из наших устройств не восстанавливались в последнее время (более тысячи каждый день).

Не уверен, что зависает (похоже, что файл никогда не записывается, поэтому я бы сказал, что либо перезагрузка, либо зависание эха?

Хотел использовать амперсанды и никогда не "блокировать" и быть уверенным, что в конечном итоге произойдет правильный сброс, однако, похоже, он вообще не работает (больше никаких перезагрузок):

5 5 * * * root /sbin/shutdown -r +2 &; sleep 240; /bin/echo `date -u +'\%Y-\%m-\%dT\%H:\%M:\%SZ'` >> /var/log/player-reboot.error.log &; echo 1 > /proc/sys/kernel/sysrq; sleep 1; echo b > /proc/sysrq-trigger

Могу ли я использовать амперсанд в cron-скрипте? Знаете ли вы еще один умный способ достичь желаемых результатов? Спасибо!

1 ответ

Более простой подход состоит в том, чтобы запланировать другой процесс для проверки на время работы более 24 часов (то есть: 25 часов). Если проверка вернула true, очевидно, что с перезагрузкой что-то пошло не так, и поэтому машина должна быть перезапущена через SysRq,

Для максимальной надежности ваша периодическая проверка не должна зависеть от crond (который может быть убит повешением shutdown процесс). Скорее используйте схему опроса; что-то вроде того:

#!/bin/bash
max_uptime=$((25*3600)) #max 25h
sleep_time=3600 #1h sleeps
while true; do
    current_uptime=`grep -o "^[[:digit:]]\+" /proc/uptime`
    echo "current uptime: $current_uptime seconds"
    if [ $current_uptime -gt $max_uptime ]; then
        echo "reboot!"
        echo 1 > /proc/sys/kernel/sysrq; sync; echo b > /proc/sysrq-trigger
    else
        echo "not now!"
    fi
    echo "sleeping..."
    sleep $sleep_time
done

Вы можете сначала запустить вышеуказанный скрипт с @rebootcrond запись, или с rc.local и друзья.

Другие вопросы по тегам