Comment suspendre et reprendre des processus comme bash

13

cette question fait suite à: comment suspendre et reprendre les processus

J'ai démarré Firefox depuis une session bash dans gnome-terminal.

L'arbre de processus ressemble à ceci:

$ ps -e -o pid,ppid,cmd -H
 1828     1   gnome-terminal
26677  1828     bash
27980 26677       /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980         /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985           /usr/lib/firefox-3.6.15/firefox-bin
28012 27989             /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true

Quand je frappe CTRL+Zen bash, cela suspendra Firefox. Lorsque j'émets la commande bg(ou fg), elle reprendra Firefox. C'est comme prévu.

Lorsque j'émets la commande kill -s SIGTSTP 27980dans un autre terminal, il imprimera la ligne [1]+ Stopped firefoxdans le premier terminal (comme lorsque je frappe CTRL+Z), mais il ne suspend pas Firefox. Je suppose que cela suspend uniquement le script shell.

Lorsque j'émets la commande kill -s SIGTSTP 27989(notez le PID) dans un autre terminal, il suspendra Firefox. Le premier terminal n'en prend pas note.

Comment bash suspend-il l'intégralité de l'arborescence des processus? traverse-t-il simplement l'arbre et SIGTSTP tous les enfants?

lesmana
la source
2
Voir aussi Différence entre le groupe de processus et le travail? .
Gilles 'SO- arrête d'être méchant'
Vous devez ajouter pgidà votre pscommande pour voir les groupes de processus dont parle @geekosaur.
ninjalj

Réponses:

17

Les emplois Shell vivent dans des "groupes de processus"; regardez la PGRPcolonne dans la pssortie étendue . Ceux-ci sont utilisés à la fois pour le contrôle des travaux et pour déterminer à qui "appartient" un terminal (réel ou pty).

POSIX (tiré de System V) utilise un ID de processus négatif pour indiquer un groupe de processus, car le groupe de processus est identifié par le premier processus du groupe ("chef de groupe de processus"). Donc, vous utiliseriez alors pspour déterminer le groupe de processus kill -s TSTP "-$pgrp". (Essayez ps -u"$USER" -opid,ppid,pgrp,cmd.)

Dans votre arborescence de processus, le groupe de processus commence par le firefoxscript lancé par bash, donc le groupe de processus serait 27980 et la commande serait kill -s TSTP -27980.

Naturellement, pour reprendre le groupe de processus, question kill -s CONT -- -27980.

geekosaure
la source
7
Soit dit en passant, bashne fait pas le SIGTSTPlorsque vous tapez ^Z; puisque firefoxle groupe de processus de est le groupe de processus actuel du terminal, le pilote de terminal (pédantiquement, discipline de ligne) envoie le SIGTSTPà tous les processus de ce groupe de processus. bashest juste waitpid()sur elle (et tout autre emploi). D'autres signaux terminaux, tels que ^Cet ^\ fonctionnent de la même manière. (méta: SE déteste cette ctrl-backslash ..)
geekosaur