Meus pensamentos:
- arquivos Pid. Eu acho que esta é uma abordagem geral.
-
Problema XY , use
autossh.
(Algumas outras respostas podem elaborar essas idéias.)
-
Existem dois scripts, certo? (não exatamente em conformidade com DRY ). Dê-lhes nomes diferentes. Seu script espera que seu
sshsaia. A instância adicional, em vez de verificar pid (s) dessh, deve verificar pid (s) de seu próprio nome. Exatamenteum piddois pids significam que nenhum script anterior ainda está sendo executado:[ $(pidof -x scriptname | wc -w) -eq 2 ] && createTunnelPor que dois? Porque
$()inicia um subshell que também conta. Bastante sujo, tudo bem. -
Um pouco fora da caixa, eu acho. Crie dois links simbólicos com nomes exclusivos, como:
ln -s /usr/bin/ssh ssh-foo ln -s /usr/bin/ssh ssh-barDeixe o primeiro script executar
ssh-foo, deixe a segunda execuçãossh-bar. Suas invocaçõespidofdevem segmentarssh-foooussh-barrespectivamente. Desta forma eles não se misturam. Como bônus,sshadicional (possivelmente executado por um motivo completamente diferente no futuro) não os afetará.
E finalmente:
-
Você não precisa verificar nada.
/usr/bin/ssh -o ExitOnForwardFailure=yes -N -R :2222:localhost:22 [email protected]Se o túnel já existir, o encaminhamento de porta falhará com certeza e
sshserá encerrado. Eu acho que você pode executar essa linha diretamente de um crontab, nenhum script é necessário.