Siga os PIDs entre máquinas (SSH)
Pergunta
Estou basicamente tentando escrever um comando do tipo pstree, exceto que ele deve seguir os processos nas máquinas.
O que quero dizer é que, se eu executar isso:
$ ssh $node sleep 1000
Então o comando deve exibir algo assim:
ssh $node -- ($node) sleep 1000
E se estou correndo:
$ ssh $node ssh $node sleep 1000
ssh $node---($node) ssh $node---($node) sleep 1000
E assim por diante ...
Minha pergunta é a seguinte: como posso mapear uma sessão SSH em uma máquina para um processo gerado em outra máquina?
Os processos locais de pai-filho não são um problema, mas como posso descobrir qual comando ssh em um nó que acionou outro processo em outro nó.
Linux 2.6.18
Apenas abre para coisas "remotas". Running OpenSSH_4.3p2 Atualmente.
Acesso SSH a todos os nós, é claro (autenticação baseada em chave), para que o PS e o NetStat estejam disponíveis em todos os nós.
Os "hacks" somente Linux são bons, não precisam ser portáteis, embora isso seja um bônus adicional, é claro.
O usuário sempre será o mesmo e meu comando/script está em execução como esse usuário. Esse usuário não é root.
Não precisa ser rápido, apenas preciso.
A solução espontânea seria escrever um pstree
Clone, que gire a sequência de comando "ssh
", descobre a fonte da fonte e depois vai para a máquina remota em questão e descobre qual de sshd
As crianças que foram geradas por esse comando em particular.
Mas talvez haja uma maneira mais inteligente? : P
Solução
Na verdade, acho que sua solução espontânea é a maneira certa de fazê-lo: use o NetStat para obter a porta-fonte e procurá-la na máquina remota. Você pode ter problemas para usar o "netstat -p" sem ser raiz - eu tentei em duas máquinas, uma que ficou feliz em me mostrar meus próprios processos e um que não foi.
Além dos clientes SSH, você pode estendê -lo para procurar outros clientes que usam conexões SSH, como RSYNC ou Mercurial. Apenas tome cuidado para não rastrear recursivamente a própria conexão do seu programa!
Um experimento rápido com o NetStat e PSTree mostra que a ideia é sólida:
me@mymachine:~$ netstat -p
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 mymachine.example:43681 remote.example.com:ssh ESTABLISHED 27044/ssh
tcp 0 0 mymachine.example:39228 remote.example.com:ssh ESTABLISHED 14499/ssh
tcp 0 0 mymachine.example:45814 remote.example.com:ssh ESTABLISHED 20899/ssh
me@mymachine:~$ ssh remote netstat -p | grep mymachine.example:43681
tcp 0 0 remote.example.com:ssh mymachine.example:43681 ESTABLISHED 10361/1
me@mymachine:~$ ssh remote pstree -a 10361
sshd
`-grep -n -e wotsit -i -R /local/home/me/somewhere /dev/null
Eu estaria interessado em ver o resultado, porque seria muito útil para mim!