Tarefa cron de reinicialização segura com fallback no problema de reconfiguração do SysRq

2

Estou tentando configurar um cron job para reinicializar dispositivos diariamente. Com um retorno de chamada seguro para uma reinicialização SysRq se, por algum motivo, a reinicialização for interrompida (sendo que o SSH é interrompido e o dispositivo nunca é reinicializado, por isso é perdido e requer intervenção humana dispendiosa para ser reiniciado).

O script que costumava funcionar por um tempo:

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

No entanto, é bastante brutal (hard reboot -f) e alguns de nossos dispositivos não se recuperaram recentemente (alguns milhares por dia).

Não sei o que trava (parece que o arquivo nunca é escrito, então eu diria que a reinicialização em si ou o eco está travado?

Pretendia usar o e comercial & para nunca "bloquear" e certifique-se de que uma redefinição adequada irá acontecer eventualmente, no entanto, parece não funcionar de todo (não mais reinicializações):

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

Posso usar o "e" comercial em um script do cron? Você conhece outra maneira mais inteligente de alcançar os resultados desejados? Obrigado!

    
por Olivier 27.11.2017 / 15:04

1 resposta

2

A abordagem mais simples é agendar outro processo para verificar por mais de 24 horas (ou seja: 25h) de tempo de atividade. Se a verificação retornar true, é óbvio que algo deu errado com a reinicialização e, portanto, a máquina deve ser reiniciada por meio de SysRq .

Para confiabilidade máxima, sua verificação periódica não deve depender de crond (que pode ser eliminado pelo processo pendente shutdown ). Em vez disso, use um esquema de pesquisa; algo assim:

#!/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

Você pode iniciar o script acima com uma entrada @reboot crond ou com rc.local e amigos.

    
por 27.11.2017 / 16:00

Tags