2012-03-27 8 views

Respuesta

0

Si conoce el ID del proceso se puede hacer uso del comando wait que es una orden interna del bash:

wait PID 

Puede obtener el PID de la última ejecución de comandos en bash utilizando $!. O bien, puede obtenerlo con la salida de ps.

De hecho, el comando de espera es una forma útil de ejecutar el comando parralel en bash. He aquí un ejemplo:

# Start the processes in parallel... 
./script1.sh 1>/dev/null 2>&1 & 
pid1=$! 
./script2.sh 1>/dev/null 2>&1 & 
pid2=$! 
./script3.sh 1>/dev/null 2>&1 & 
pid3=$! 
./script4.sh 1>/dev/null 2>&1 & 
pid4=$! 

# Wait for processes to finish... 
echo -ne "Commands sent... " 
wait $pid1 
err1=$? 
wait $pid2 
err2=$? 
wait $pid3 
err3=$? 
wait $pid4 
err4=$? 

# Do something useful with the return codes... 
if [ $err1 -eq 0 -a $err2 -eq 0 -a $err3 -eq 0 -a $err4 -eq 0 ] 
then 
    echo "pass" 
else 
    echo "fail" 
fi 
+8

Sí. Pero quería agregar que solo puede esperar el código de salida del pid si ese pid es uno de sus hijos. –

+0

Ah, gracias @Apprentice Queue, no sabía eso. –

+1

Esto solo funciona en el shell desde el cual se invocó el proceso original; no por un proceso arbitrario. –

3

¿Hay una manera que puedo esperar hasta que se completa el PID y obtener su código de salida

Sí, si el proceso no está siendo ptrace d por otra persona, que puede PTRACE_ATTACH y recibir notificaciones sobre varios eventos (por ejemplo, señales recibidas) y sobre su salida.

Cuidado, esto es bastante complicado de manejar correctamente.

+0

¿funcionará para un proceso arbitrario? desde http://linux.die.net/man/2/ptrace - La llamada al sistema ptrace() proporciona un medio por el cual un proceso ** padre ** puede observar y controlar la ejecución de otro proceso. – user1296013

+0

@ user1296013 Sí, funcionará para un proceso arbitrario (que ya no se está siguiendo) para el que tiene permiso (por ejemplo, si puede matarlo). Una vez que 'ptrace (PTRACE_ATTACH, ..)' it, * se convierte * en el padre. –

+0

@EmployedRussian Deberías agregar esto en [Greg's Wiki] (http://mywiki.wooledge.org/ProcessManagement). – l0b0

6

Puede usar strace, que rastrea las señales y las llamadas al sistema. Los siguientes comando espera hasta que se haga un programa, luego imprime su código de salida:

$ strace -e none -e exit_group -p $PID  # process calls exit(1) 
Process 23541 attached - interrupt to quit 
exit_group(1)       = ? 
Process 23541 detached 

$ strace -e none -e exit_group -p $PID  # ^C at the keyboard 
Process 22979 attached - interrupt to quit 
--- SIGINT (Interrupt) @ 0 (0) --- 
Process 22979 detached 

$ strace -e none -e exit_group -p $PID  # kill -9 $PID 
Process 22983 attached - interrupt to quit 
+++ killed by SIGKILL +++ 

Las señales de ^Z, fg y kill -USR1 se imprimen también. De cualquier manera, necesitará usar sed si desea usar el código de salida en un script de shell.

Si eso es demasiado código de shell, puede usar un program I hacked together in C hace un tiempo. Utiliza ptrace() para captar señales y códigos de salida de pids. (Tiene bordes ásperos y puede no funcionar en todas las situaciones.)

¡Espero que ayude!

Cuestiones relacionadas