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
ssh
saia. 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 ] && createTunnel
Por 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-bar
Deixe o primeiro script executar
ssh-foo
, deixe a segunda execuçãossh-bar
. Suas invocaçõespidof
devem segmentarssh-foo
oussh-bar
respectivamente. Desta forma eles não se misturam. Como bônus,ssh
adicional (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
ssh
será encerrado. Eu acho que você pode executar essa linha diretamente de um crontab, nenhum script é necessário.