Pourquoi les processus en arrière-plan s'arrêtent-ils parfois spontanément?

10

Parfois, quelque temps après avoir mis en arrière-plan un processus avec bgen bash, lorsque j'appuie sur Entrée dans le même shell pour réafficher l'invite (juste pour vérifier que je suis toujours en bash quand une sortie du processus en arrière-plan a été affichée), le processus d'arrière-plan semble s'arrêter spontanément.

Si je bgrecommence, le même problème se reproduit.

La seule façon de résoudre ce problème semble être fg.

Pourquoi cela arrive-t-il?

Robin Green
la source
Où va votre sortie? Remplissez-vous un tampon quelque part?
Paul Tomblin

Réponses:

12

Cela se produit généralement si le processus essaie de lire à partir de son stdinflux. Lorsque le processus est en arrière-plan, il reçoit un signal TTIN et est donc figé (même comportement qu'un signal STOP). Il existe également le double signal TTOU lorsqu'un processus d'arrière-plan tente d'écrire sur son terminal.

Le mettre au premier plan reprend le processus et lui permet de lire à partir de votre terminal.

Démo:

$ cat t.sh
#! /bin/sh
sleep 1
read dummy
$ ./t.sh &
[1] 3364
$ 
[1]+  Stopped                 ./t.sh
$ ps aux|grep t.sh
me  3364  0.0  0.0  11268  1200 pts/0    T    17:04   0:00 /bin/sh ./t.sh

Une des façons d'éviter cela est d'utiliser nohup, mais cela peut avoir des effets étranges si le programme ne gère pas la redirection de son flux d'entrée /dev/null.

Tapis
la source