É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.

Alexander Mills
la source
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)
Alexander Mills
la source
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
Derek Callaway
la source
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