2010-12-06 12 views
6

Quiero ejecutar alguna aplicación en segundo plano y luego matarla por pid.Popen obteniendo pid del proceso de nueva ejecución

pipe = IO.popen("firefox 'some_url' 2>&1 &") 
pipe.pid 

Este código inicia firefox y me devuelve un pid, pero desafortunadamente no es el pid de firefox.

pipe = IO.popen("firefox") 
pipe.pid 

Este código inicia firefox y devuelve mi algo pid, el pid de firefox. ¿Hay alguna solución para iniciar la aplicación externa y obtener su pid? Firefox es solo por ejemplo podría ser cualquier otra aplicación. También probé con libs como: Open3 y Open4 pero parece tener el mismo efecto. También me pregunto si '$!' Bash variable es una buena solución para esto? Ejecuta algo en segundo plano y lee '$!', ¿Qué opinas?

+0

¿Es el pid de cualquier proceso de ejecución? En general, el comando que comience con popen puede engendrar cualquier cantidad de otros procesos, por lo que si desea un pid específico de aquellos que necesita para encontrar otra forma de identificar el proceso que está buscando. –

Respuesta

7

Dado que se está ejecutando en segundo plano (command &), se obtiene el PID del intérprete:

>> pipe = IO.popen("xcalc &") 
>> pipe.pid 
=> 11204 

$ ps awx | grep "pts/8" 
11204 pts/8 Z+  0:00 [sh] <defunct> 
11205 pts/8 S+  0:00 xcalc 

Drop the &:

>> pipe = IO.popen("xcalc") 
>> pipe.pid 
=> 11206 

$ ps awx | grep "pts/8" 
11206 pts/8 S  0:00 xcalc 

Para el problema adicional con el cambio de dirección, ver @ La respuesta de Kares

4

no se trata solo de ejecutarlo en segundo plano, sino también de 2>&1

err reorientación de entrada/salida causas IO.popen para poner otro proceso en frente de su proceso real (pipe.pid no será correcto)

aquí es una visión detallada: http://unethicalblogger.com/2011/11/12/popen-can-suck-it.html

posible solución para este podría estar utilizando exec p.ej IO.popen("exec firefox 'some_url' 2>&1")

+0

De hecho, pasé por alto esto por completo. – tokland

Cuestiones relacionadas