Écoutez la sortie du processus étant donné le pid $$


14

Dis que j'ai un pid en main, mypid=$$

existe-t-il une commande bash / system que je peux utiliser pour écouter la sortie de ce processus avec le pid donné?

Si aucun processus avec mypid n'existe, je suppose que la commande devrait simplement échouer.


Je n'utilise pas C #, mais apparemment il doit y avoir un moyen: msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
Alexander Mills

Sous Unix, il est courant d'attendre les processus enfants à l' aide waitdu shell ou de la wait()fonction de bibliothèque C. Il n'y a pas d'AFAIK d'attente standard pour un processus non enfant. Il n'est pas clair non plus si la fonction C # peut le faire (cela dépend de ce qu'est un "processus associé").
Kusalananda

Je pourrais le faire avec un sondage, mais ce serait horrible
Alexander Mills

Cela pourrait également vous donner de mauvais résultats. La réutilisation du PID peut théoriquement signifier qu'un processus pourrait prendre vie avec le même PID que le processus que vous attendez. Sous Linux (avec des PID séquentiels), cela serait peu probable , mais sur des systèmes comme OpenBSD (allocation PID aléatoire), ce serait un problème.
Kusalananda

Réponses:


19

J'ai obtenu ce dont j'avais besoin de cette réponse: /programming//a/41613532/1223975

..turns using wait <pid> ne fonctionnera que si ce pid est un processus enfant du processus en cours .

Cependant, ce qui suit fonctionnera pour n'importe quel processus:

Attendre la fin de tout processus

Linux:

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

Darwin (nécessite d' $pidavoir des fichiers ouverts):

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

Avec timeout (secondes)

Linux:

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

Darwin (nécessite d' $pidavoir des fichiers ouverts):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

Ce n'est pas lié à Linux, c'est une fonctionnalité de GNU tail. Donc, cela fonctionnera sur n'importe quel système avec GNU tail comme ceux GNU / Linux, et cela ne fonctionnerait pas sur les systèmes Linux non GNU.
Stéphane Chazelas

Je crains que tail / lsof n'utilise le sondage dans ce cas, du moins compte tenu des preuves empiriques qui semblent ainsi sur MacOS.
Alexander Mills

lsof + r le met en mode répétition, de sorte que la commande se répète toutes les secondes, donc il utilise le polling, putain
Alexander Mills

3

Vous pouvez utiliser la commande bash intégrée 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.

Il utilise l'appel système waitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state

agréable qui fonctionne pour moi, j'espère qu'il n'utilise pas de sondage sous le capot, merci!
Alexander Mills

1
ouais ne fonctionnera pas pour mon cas d'utilisation, je reçois cette erreur: bash: wait: pid 47760 is not a child of this shell... retour à la planche à dessin lol
Alexander Mills

J'ai une réponse, je viens de la poster thx
Alexander Mills

1
Cela n'attendra que les processus enfants, pas un processus non associé au processus actuel.
Kusalananda
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.