Qu'advient-il des tâches d'arrière-plan après avoir quitté le shell?

9

De ma compréhension, les emplois sont conduites ouvertes à partir d' une certaine shell et vous pouvez gérer ces emplois ( fg, bg, Ctrl-Z) à l' intérieur de cette enveloppe. Un travail peut consister en plusieurs processus / commandes.

Ma question est ce qui arrive à ces travaux lorsque l'original, contenant le shell, se termine? Supposons que huponexit n'est pas défini afin que les processus d'arrière-plan continuent de fonctionner après la fermeture du shell.

Supposons que j'ai fait:

$ run.sh | grep 'abc' &
[1] job_id

Ensuite, je quitte ce shell. Je vais entrer dans un nouveau shell et courir jobset ne rien voir évidemment. Mais je peux faire ps aux | grep run.shet voir ce processus en cours d'exécution et je vais aussi le faire ps aux | grep grepet voir le processus pour grep 'abc'fonctionner aussi.

Existe-t-il un moyen d'obtenir simplement l'ID de travail pour le pipeline complet afin que je puisse le tuer en une seule fois, ou dois-je tuer tous les processus séparément d'un autre shell une fois que j'ai quitté le shell d'origine? (J'ai essayé ce dernier et cela fonctionne, mais il semble difficile de garder une trace de tous les processus.)

user2193268
la source

Réponses:

7

Lorsque le shell se ferme, il peut envoyer le signal HUP aux tâches d'arrière-plan, ce qui peut entraîner leur fermeture. Le signal SIGHUP n'est envoyé que si le shell lui-même reçoit un SIGHUP, c'est-à-dire uniquement si le terminal disparaît (par exemple parce que le processus d' exitémulation de terminal meurt) et non si vous quittez le shell normalement (avec le module intégré ou en tapant Ctrl+ D). Voir Dans quels cas SIGHUP n'est-il pas envoyé à un travail lorsque vous vous déconnectez? et Existe - t-il une variante UNIX sur laquelle un processus enfant meurt avec son parent? pour plus de détails. Dans bash, vous pouvez définir l' huponexitoption pour envoyer également SIGHUP aux tâches d'arrière-plan sur une sortie normale. Dans ksh, bash et zsh, appelerdisownsur un travail le supprime de la liste des travaux auxquels envoyer SIGHUP. Un processus qui reçoit SIGHUP peut ignorer ou intercepter le signal, puis il ne mourra pas. L'utilisation nohuplorsque vous exécutez un programme le rend immunisé contre SIGHUP.

Si le processus n'est pas tué en raison d'un éventuel SIGHUP, il reste en arrière. Il n'y a plus rien à associer aux numéros de tâche dans le shell.

Le processus peut toujours mourir s'il essaie d'accéder au terminal mais le terminal n'existe plus. Cela dépend de la façon dont le programme réagit à un terminal inexistant.

Si le travail contient plusieurs processus (par exemple un pipeline), alors tous ces processus sont dans un groupe de processus . Les groupes de processus ont été inventés précisément pour capturer la notion d'un travail shell qui est composé de plusieurs processus connexes. Vous pouvez voir les processus regroupés par groupe de processus en affichant leur ID de groupe de processus (PGID - normalement l'ID de processus du premier processus du groupe), par exemple avec ps lsous Linux ou quelque chose comme ps -o pid,pgid,tty,etime,commportable.

Vous pouvez tuer tous les processus d'un groupe en passant un argument négatif à kill. Par exemple, si vous avez déterminé que le PGID du pipeline que vous souhaitez tuer est 1234, vous pouvez le supprimer avec

kill -TERM -1234
Gilles 'SO- arrête d'être méchant'
la source
2

En général, ils fonctionnent toujours, mais vous devriez utiliser nohup, si vous avez oublié ou changé d'avis, utilisez renier.

mike@mike-laptop4:~$ sleep 500
^Z
[1]+  Stopped                 sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+  Running                 sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$ 
mikejonesey
la source
et pour tuer, vous pouvez vérifier le bash parent avec ps -ef --forest, si le bash a des fonctions d'arrière-plan, vous devrez peut-être également les tuer
mikejonesey