Obtendo um pid para um processo ssh que se baseou

3

Então, eu queria chamar dois processos ssh em segundo plano:

ssh -D localhost:8087 -fN aws-gateway-vpc1
ssh -D localhost:8088 -fN aws-gateway-vpc2

Esses gateways não têm o benefício de permitir que eu defina um arquivo authorized_keys, portanto, devo ser solicitado a fornecer minha senha interativa. É por isso que estou usando o sinalizador -f , e não o & do shell, que só irá embasar o processo depois que eu autenticar interativamente.

Neste cenário, parece que não consigo usar a variável $! bash para obter o pid do processo recente [self] em segundo plano.

Quais outras opções eu tenho para encontrar o pid correto para matar mais tarde se interrompido?

    
por dlamblin 29.08.2017 / 11:09

1 resposta

3

O $! não funciona, como você diz, porque não foi feito em segundo plano pelo shell atual. Na verdade, o processo ssh nem sequer é filho do shell do qual você o iniciou. No meu sistema Arch, pelo menos, ele é executado como um filho de PID 1 , o processo init .

Então, para obter o PID, você pode simplesmente usar ps :

$ ssh -f  localhost sleep 100
$ ps aux | grep '[s]sh.*-f'
terdon   20648  0.0  0.0  43308   680 ?        Ss   12:15   0:00 ssh -f localhost sleep 100

Isso me diz que o PID é 20648 * .

Como alternativa, e mais simples, use pgrep -f :

$ pgrep -f 'ssh.*-f'
20648

E, para matá-lo (eles):

pkill -f 'ssh.*-f'

* Consulte esta pergunta se você estiver se perguntando sobre o [s] no comando grep .

    
por 29.08.2017 / 11:16