Ao tentar estabelecer um túnel ssh, notei que, mesmo se a conexão falhar, o processo permanece ativo. Por exemplo, se eu tentar executar este comando enquanto hostname
estiver inativo:
/usr/bin/ssh -f -i /home/user/.ssh/id_rsa -N -R 3000:localhost:22 user@hostname
Ocasionalmente recebo a resposta:
Warning: remote port forwarding failed for listen port 3000
Eu só recebo essa mensagem de erro quando o processo original (em execução na máquina local) morre, mas o servidor remoto ainda não percebe. O processo tenta reiniciar, mas o servidor acha que ainda tem uma conexão em 3000 e não vai além de uma nova conexão, resultando no aviso acima.
Mas se eu fizer um pgrep -x ssh
, posso ver que o processo ainda está ativo. Eu gostaria de executar este comando ssh como parte de um script bash em um cronjob que primeiro verifica para ver se o túnel é estabelecido e se não for restabelecido, mas a maneira que eu tenho o script de configuração a) vê que o túnel é para baixo e tenta criar um novo (que secretamente falha), ou b) vê que o processo falho está vivo e não faz nada. O resultado é que o túnel nunca é restabelecido, desde que esse processo falhe ainda exista.
Existe uma maneira de simplesmente matar o processo se a conexão falhar em vez de receber um aviso?