Eu tenho um script (não escrito por mim, não posso modificá-lo) que tem que rodar por dias, que às vezes falha (sai com erro).
Nesse caso, tudo o que preciso fazer é reiniciar o servidor (não há solução melhor por enquanto) e reiniciar o script. Atualmente faço isso:
logar via SSH
screen -S job
./myscript.sh
para iniciar o trabalho (digamos que este script contém apenas:dothis
e este processo pode sair com um erro)CTRL A, Dpara separar da tela
...aguardar algumas horas...
faça login, retome a tela com
screen -r job
.Se ainda estiver em execução, desconecte e volte mais tarde.
Se o script falhou,sudo reboot
, e inicie na etapa 1, para que o trabalho longo continue.
Como fazer isso sem intervenção manual?
Como automatizar isso e fazer com que o servidor reinicie automaticamente se o script existir com um erro e, em seguida, reinicie o script?
Primeiro, eu tentaria colocar esse script em um contêiner. isso removeria algumas dependências do próprio host e permitiria a reinicialização automática.
Solução usando docker e docker-compose
Essa abordagem requer docker e docker compose. Se você tem o Ubuntu, você pode instalá-los via
sudo apt install docker.io docker-compose
.Salve o nome acima como
Dockerfile
em qualquer pasta. Você pode ver alguns documentos em https://docs.docker.com/engine/reference/builder/Coloque isso como
docker-compose.yml
no mesmo diretório que seu Dockerfile. Veja alguns documentos aqui: https://docs.docker.com/compose/compose-file/compose-file-v3/Suponho que você queira obter alguma saída do script; nesse caso, talvez seja necessário configurar volumes do docker para "compartilhar" pastas entre seu host e o contêiner.
docker-compose up -d
.Usando esse método, você coloca seu script em um contêiner, reiniciará o contêiner após cada falha de script e será executado como um daemon.
Solução usando systemd
Se você não quiser lidar com contêineres, você pode envolver seu script em outro, por exemplo
my-runner.sh
.Isso reiniciará seu computador após a falha do script. Observe que a reinicialização pode exigir um comando diferente ou privilégios de root.
E agora, vamos fazer um serviço systemd do nosso script runner. Este é um bom tutorial, mas se resume ao seguinte:
Crie um arquivo de unidade systemd como
/etc/systemd/system/my-script.service
e coloque o seguinte nele.Agora você só precisa emitir
systemcl start my-script && systemctl enable my-script
para iniciá-lo e fazê-lo iniciar após a reinicialização.