Come sospendere e riprendere processi come fa bash


13

questa domanda è il seguito di: Come sospendere e riprendere i processi

Ho avviato Firefox da una sessione bash in gnome-terminal.

L'albero del processo è simile al seguente:

$ 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

Quando colpisco CTRL+Zbash, sospenderà Firefox. Quando invio il comando bg(o fg) riprenderà Firefox. Questo è come previsto.

Quando invio il comando kill -s SIGTSTP 27980in un altro terminale, verrà stampata la riga [1]+ Stopped firefoxnel primo terminale (proprio come quando ho colpito CTRL+Z), ma non sospende Firefox. Suppongo che sospenda solo lo script della shell.

Quando invio il comando kill -s SIGTSTP 27989(notare il PID) in un altro terminale, sospenderà Firefox. Il primo terminale non ne prende atto.

In che modo bash sospende l'intero albero dei processi? attraversa semplicemente l'albero e SIGTSTP tutti i bambini?



Dovresti aggiungere pgidal tuo pscomando per vedere i gruppi di processi di cui parla @geekosaur.
ninjalj,

Risposte:


17

I lavori Shell vivono in "gruppi di processi"; guarda la PGRPcolonna psnell'output esteso . Questi vengono utilizzati sia per il controllo del lavoro che per determinare chi "possiede" un terminale (reale o pty).

POSIX (preso dal sistema V) utilizza un ID processo negativo per indicare un gruppo di processi, poiché il gruppo di processi viene identificato dal primo processo nel gruppo ("leader del gruppo di processi"). Quindi useresti psper determinare il gruppo di processi, quindi kill -s TSTP "-$pgrp". (Prova ps -u"$USER" -opid,ppid,pgrp,cmd.)

Nell'albero del processo, il gruppo di processi inizia con lo firefoxscript avviato da bash, quindi il gruppo di processi sarà 27980 e il comando sarà kill -s TSTP -27980.

Naturalmente, per riprendere il gruppo di processi, problema kill -s CONT -- -27980.


7
A proposito, bashnon sta facendo SIGTSTPquando digiti ^Z; poiché firefoxil gruppo di processi è il gruppo di processi corrente del terminale, il driver del terminale (pedanticamente, disciplina di linea) invia il SIGTSTPa tutti i processi in quel gruppo di processi. bashci sta solo waitpid()pensando (e qualsiasi altro lavoro). Altri segnali terminali, come ^Ce ^\ funzionano allo stesso modo. (meta: SE odia quel ctrl-backslash ..)
geekosaur
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.