Escuche la salida del proceso dado pid $$

14

Digamos que tengo un pid en la mano, mypid=$$

¿hay algún comando bash / system que pueda usar para escuchar la salida de ese proceso con el pid dado?

Si no existe ningún proceso con mypid, supongo que el comando simplemente debería fallar.

Alexander Mills
fuente
No uso C #, pero aparentemente debe haber una manera: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
Alexander Mills
En Unix, es común esperar los procesos secundarios que se utilizan waiten el shell o la wait()función de biblioteca C. AFAIK no tiene una forma estándar de esperar un proceso que no sea de niños. Además, no está claro si la función C # puede hacer eso (depende de lo que sea un "proceso asociado").
Kusalananda
Podría hacer esto con encuestas pero sería horrible
Alexander Mills
También podría darte resultados incorrectos. La reutilización de PID puede significar teóricamente que un proceso podría cobrar vida con el mismo PID que el proceso que está esperando. En Linux (con PID secuenciales) esto sería poco probable , pero en sistemas como OpenBSD (asignación de PID aleatoria), sería un problema.
Kusalananda

Respuestas:

19

Obtuve lo que necesitaba de esta respuesta: /programming//a/41613532/1223975

.. resulta que usar wait <pid> solo funcionará si ese pid es un proceso secundario del proceso actual .

Sin embargo, lo siguiente funcionará para cualquier proceso:

Esperar a que termine cualquier proceso

Linux:

tail --pid=$pid -f /dev/null

Darwin (requiere que $pidtenga archivos abiertos):

lsof -p $pid +r 1 &>/dev/null

Con tiempo de espera (segundos)

Linux:

timeout $timeout tail --pid=$pid -f /dev/null

Darwin (requiere que $pidtenga archivos abiertos):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)
Alexander Mills
fuente
No está relacionado con Linux, es una característica de GNU tail. Por lo tanto, funcionará en cualquier sistema con GNU tail como GNU / Linux, y no funcionaría en sistemas basados ​​en Linux que no sean GNU.
Stéphane Chazelas
Me temo que tail / lsof usará encuestas en este caso, al menos dada la evidencia empírica que parece de esa manera en MacOS.
Alexander Mills
lsof + r lo pone en modo de repetición, por lo que ese comando se repite cada segundo, por lo que usa sondeo, maldición
Alexander Mills
3

Puedes usar el bash incorporado wait:

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

Utiliza la llamada al sistema waitpid().

$ whatis waitpid
waitpid (2)          - wait for process to change state
Derek Callaway
fuente
bueno, eso funciona para mí, espero que no use encuestas debajo del capó, ¡gracias!
Alexander Mills
1
sí, no funcionará para mi caso de uso, me sale este error: bash: wait: pid 47760 is not a child of this shell... de vuelta a la mesa de dibujo jajaja
Alexander Mills
Tengo respuesta, lo acabo de publicar gracias
Alexander Mills
1
Esto solo esperará procesos secundarios, no un proceso no asociado con el proceso actual.
Kusalananda