2012-03-26 12 views
6

No puedo encontrar una respuesta simple para esto: estoy usando paramiko para iniciar sesión y ejecutar varios procesos de forma remota y necesito los PID de cada proceso para verificarlos en otro momento . No parece ser una función en paramiko para obtener el PID de un comando ejecutado, por lo que he intentado usar el siguiente:obtener PID de paramiko

stdin,stdout,stderr = ssh.exec_command('./someScript.sh &;echo $!;) 

pensé que a continuación el análisis a través de la salida estándar devolvería el PID, pero doesn 't. Supongo que debería ejecutar el script en segundo plano para tener un PID (mientras se está ejecutando). ¿Hay una forma más simple y obvia de obtener el PID?

+2

@JohnZwinck , una solución que no implica ajustar el El comando remoto implicaría parchear el daemon SSH _en el servidor_, no el módulo 'paramiko' que se ejecuta en el cliente. La respuesta de @ SørenLøvborg parece ser la forma más adecuada para mí. – lanzz

Respuesta

9

Aquí está una manera de obtener el proceso de identificación remoto:

def execute(channel, command): 
    command = 'echo $$; exec ' + command 
    stdin, stdout, stderr = channel.exec_command(command) 
    pid = int(stdout.readline()) 
    return pid, stdin, stdout, stderr 
+1

Solo para mayor seguridad, puede usar '&&' en lugar de ';' después del comando echo. De esa forma no hay posibilidad de que lea lo incorrecto como el PID. –

+0

@JohnZwinck: Ehn, supongo. 'echo $$' es requerido por POSIX y una utilidad incorporada en esencialmente todas las implementaciones de shell [desde 1987 más o menos] (http://unix.stackexchange.com/questions/1355/why-is-echo-a-shell -construido-al-comando). Si 'echo $$' de alguna manera falla, diría que todas las apuestas están desactivadas. :-) –

+0

@ SørenLøvborg ¿No es $$ el PID del shell (no del 'comando' que se ejecuta)? –

0

Normalmente uso el comando UNIX estándar pidof <command name>, cuando reviso el proceso más tarde. AFAIK no hay una manera más simple.

OK, dado su comentario, puede resolverlo envolviendo su ./someScript.sh en un proceso de Python que utiliza el módulo de subproceso.

wrapper.py:

import subprocess 
import sys 
proc = subprocess.Popen(sys.argv[1]) 
print proc.pid 
proc.wait() #probably 

A continuación, ejecute

stdin,stdout,stderr = ssh.exec_command('./wrapper.py ./someScript.sh') 

y leer la salida

+1

Correcto, pero esto necesitará un truco algo feo para mí: estoy iniciando sesión en servidores remotos que probablemente tengan varios usuarios y ciertamente tengan varias instancias de mi software ejecutándose en ellos. Lo que estoy buscando es el PID del trabajo específico que configuro ejecutando con exec_command. – radpotato