scripts script pasar parametros operaciones manejo español ejemplos comandos comando cadenas aritmeticas bash shell

pasar - ¿Cómo puedo obtener tanto el ID de proceso como el código de salida de un script de bash?



scripts bash ejemplos (1)

Necesito un script bash que haga lo siguiente:

  • Inicia un proceso en segundo plano con toda la salida dirigida a un archivo.
  • Escribe el código de salida del proceso en un archivo
  • Devuelve el pid del proceso (de inmediato, no cuando el proceso sale).
  • El script debe salir

Puedo obtener el pid pero no el código de salida:

$ executable >>$log 2>&1 & pid=`jobs -p`

O, puedo capturar el código de salida pero no el pid:

$ executable >>$log; # blocked on previous line until process exits echo $0 >>$log;

¿Cómo puedo hacer todo esto al mismo tiempo?


El pid esta en $! , no es necesario ejecutar jobs . Y el estado de retorno se devuelve por wait :

$executable >> $log 2>&1 & pid=$! wait $! echo $? # return status of $executable

EDIT 1

Si comprendo el requisito adicional como se indica en un comentario, y desea que el script regrese inmediatamente (sin esperar a que finalice el comando), no será posible que el script inicial escriba el estado de salida del comando. Pero es bastante fácil que un intermediario escriba el estado de salida tan pronto como el niño termine. Algo como:

sh -c "$executable"'' & echo pid=$! > pidfile; wait $!; echo $? > exit-status'' &

Deberia trabajar.

EDIT 2

Como se señaló en los comentarios, esa solución tiene una condición de carrera: la secuencia de comandos principal termina antes de que se escriba el archivo pid. La OP resuelve esto haciendo un bucle de sueño de sondeo, que es una abominación y me temo que tendré problemas para dormir por la noche sabiendo que puedo haber motivado tal farsa. OMI, lo correcto es esperar hasta que el niño termine. Como eso es inaceptable, aquí hay una solución que bloquea en una lectura hasta que el archivo pid existe en lugar de hacer el ciclo de espera en bucle:

{ sh -c "$executable > $log 2>&1 &"'' echo $! > pidfile echo # Alert parent that the pidfile has been written wait $! echo $? > exit-status '' & } | read