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
$targetuser
no 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
-N
ao seu comandossh
no script de exemplo para que ele apenas inicie o encapsulamento, mas não tente criar um shell de login. - Eu adicionei
-f
aautossh
para 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
.