Uma solução melhor seria usar o watchdog. O watchdog é um daemon que assistirá aos processos em execução e, se eles saírem, os reiniciará automaticamente.
Instale o watchdog no Ubuntu 16.04
sudo apt-get install watchdog
Como funciona o watchdog
O daemon watchdog(8) executará scripts em /etc/watchdog.d com o argumento test ou repair . (veja TEST DIRECTORY seção da watchdog(8) man page ). Seu script de watchdog lida com esses dois argumentos quando verifica se um processo está em execução e executa uma ação para repará-lo.
Você pode configurar o watchdog modificando /etc/watchdog.conf (veja watchdog.conf(5) ).
Exemplo de watchdog.d script
Tome por exemplo /etc/watchdog.d/autossh_script (que tem 755 permissões e é de propriedade de root ).
Nota: você pode precisar personalizar a variável de ambiente
$targetuserno script de exemplo.samé meu nome de usuário.
#!/bin/bash
targetuser=sam
runTest=false
runRepair=false
case in
test)
runTest=true
;;
repair)
runRepair=true
repairExitCode=
;;
*)
echo 'Error: script needs to be run by watchdog' 1>&2
exit 1
;;
esac
if ${runTest}; then
#run a test here which will tell the status of your process
#the exit code of this script will be the repairExitCode if it is non-zero
if ! pgrep autossh &> /dev/null; then
#autossh not running; notify watchdog to repair
exit 1
else
#autossh running; no action necessary
exit 0
fi
fi
if ${runRepair}; then
#take an action to repair the affected item
#use a case statement on $repairExitCode to handle different failure cases
su - ${targetuser} -c 'nohup autossh -f -- -NCD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC'
exit 0
fi
- Eu adicionei
-Nao seu comandosshno script de exemplo para que ele apenas inicie o encapsulamento, mas não tente criar um shell de login. - Eu adicionei
-faautosshpara que ele seja executado em segundo plano. - O script de exemplo usa um padrão simples
pgrep. No entanto, você pode restringir ainda mais o teste a um usuário específico ou até mesmo usar um padrão para o processo. Consultepgrep(1)para saber como personalizar ainda mais seu teste usando pgrep.
Configurando o watchdog
/etc/watchdog.conf e /etc/defaults/watchdog são locais para configurar o watchdog. Veja watchdog.conf(5) .
Uma coisa a notar é que os scripts do usuário são executados uma vez a cada segundo por padrão. Eu recomendo aumentar isso para pelo menos 30 segundos, a menos que você precise de mais verificações em tempo real. Ajuste a configuração interval em watchdog.conf .
Resolução de problemas
Você pode precisar criar o diretório /etc/watchdog.d antes do seu script.
/var/log/watchdog/* contém logs e erros relacionados ao watchdog. Se o seu script for gerado para stdout ou stderr, ele será gravado lá. No meu sistema, percebo que meu script executa test ou repair aproximadamente uma vez a cada segundo. Se você usar echo em seu script, ele deverá ser temporário apenas para fins de depuração. Caso contrário, recomenda-se descartar a saída, exceto no caso de erros.
Se o seu script não estiver sendo executado, verifique as permissões: ls -l /etc/watchdog.d .