2010-02-08 13 views
5

Básicamente estoy tratando de escribir un comando pstree, excepto que debe seguir los procesos en todas las máquinas.Seguir pids across machines (ssh)

Lo que quiero decir es que si me quedo esto:

$ ssh $node sleep 1000 

A continuación, el comando debería mostrar algo como esto:

ssh $node -- ($node) sleep 1000 

y si estoy ejecutando:

$ ssh $node ssh $node sleep 1000 

ssh $node---($node) ssh $node---($node) sleep 1000 

Y así sucesivamente ...

Mi pregunta es esta: ¿cómo puedo asignar una sesión ssh en una máquina a un proceso generado en otra máquina?

procesos locales de padres e hijos no son un problema, pero ¿cómo puedo averiguar cual de comandos ssh en un nodo que desencadenó otro proceso en otro nodo.

  1. Linux 2.6.18

  2. única openSSH para la materia "a distancia". Ejecutando OpenSSH_4.3p2 actualmente.

  3. acceso SSH a todos los nodos de curso (autenticación basada en una clave) para ps y netstat están disponibles en todos los nodos.

  4. sólo Linux "hacks" están bien, no tiene por qué ser portátil aunque eso sería una ventaja añadida, por supuesto.

  5. El usuario siempre será el mismo y mi comando/script se está ejecutando como ese usuario. Ese usuario no es root

  6. No tiene que ser rápido, solo preciso.

La solución espontánea sería escribir un clon pstree, que desencadena en la cadena de comando "ssh", se da cuenta de la fuente de puertos y luego se va a la máquina remota en cuestión y se da cuenta de lo que uno de sshd los hijos que se generó por este comando en particular.

¿Pero tal vez hay una manera más inteligente? : P

+0

No entiendo completamente la pregunta. ¿Qué quieres decir con "mapeo" de una sesión ssh? ¿quieres nombrar tu sesión ssh? (A continuación, la pantalla de aplicación agradable sería mi puntero a la solución) – Karussell

+0

quiero asignar el identificador de proceso del comando: "ssh $ nodo sueño 1000" a la ID del proceso del comando: "dormir 1000" en la máquina remota ($ node). – user268744

Respuesta

1

En realidad, creo que su solución espontánea es la forma correcta de hacerlo: el uso netstat para obtener el código fuente puertos y buscar la información en la máquina remota. Puede tener problemas para usar "netstat -p" sin ser root. Lo probé en dos máquinas, una que estaba feliz de mostrarme mis propios procesos y otra que no.

Así como clientes ssh, es posible extender este para buscar otros clientes que utilizan las conexiones ssh, como rsync o mercurial. ¡Solo tenga cuidado de no rastrear la conexión de su programa recursivamente!

Un experimento rápido con netstat y pstree muestra que la idea es buena:

[email protected]:~$ 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 
[email protected]:~$ ssh remote netstat -p | grep mymachine.example:43681 
tcp  0  0 remote.example.com:ssh mymachine.example:43681 ESTABLISHED 10361/1 
[email protected]:~$ ssh remote pstree -a 10361 
sshd 
    `-grep -n -e wotsit -i -R /local/home/me/somewhere /dev/null 

estaría interesado en ver el resultado, ya que sería muy útil para mí!