Esta pergunta é uma continuação de: Como suspender e retomar processos
Eu iniciei o firefox a partir de uma sessão do bash no gnome-terminal.
A árvore do processo é assim:
$ 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 eu bato CTRL+Z
no bash, ele suspende o firefox. Quando eu emito o comando bg
(ou fg
), ele será reiniciado no Firefox. Isto é como esperado.
Quando eu emito o comando kill -s SIGTSTP 27980
em outro terminal, ele imprime a linha [1]+ Stopped firefox
no primeiro terminal (como quando bati CTRL+Z
), mas não suspende o firefox. Presumo que apenas suspenda o script de shell.
Quando eu emito o comando kill -s SIGTSTP 27989
(observe o PID) em outro terminal, ele suspende o firefox. O primeiro terminal não toma nota disso.
Como o bash suspende toda a árvore do processo? apenas atravessa a árvore e SIGTSTP todas as crianças?
fonte
pgid
ao seups
comando para ver os grupos de processos sobre os quais o @geekosaur está falando.Respostas:
Os trabalhos da Shell vivem em "grupos de processos"; veja a
PGRP
coluna naps
saída estendida . Eles são usados tanto para controle do trabalho quanto para determinar quem "possui" um terminal (real ou pty).O POSIX (extraído do Sistema V) usa um ID de processo negativo para indicar um grupo de processos, pois o grupo de processos é identificado pelo primeiro processo no grupo ("líder do grupo de processos"). Então você usaria
ps
para determinar o grupo de processos, entãokill -s TSTP "-$pgrp"
. (Tenteps -u"$USER" -opid,ppid,pgrp,cmd
.)Na sua árvore de processos, o grupo de processos começa com o
firefox
script iniciado porbash
, portanto, o grupo de processos seria 27980 e o comando seriakill -s TSTP -27980
.Naturalmente, para retomar o grupo de processos, emita
kill -s CONT -- -27980
.fonte
bash
não está fazendo oSIGTSTP
quando você digita^Z
; comofirefox
o grupo de processos do grupo é o grupo de processos atual do terminal, o driver do terminal (pedanticamente, disciplina de linha) enviaSIGTSTP
todos os processos nesse grupo de processos.bash
está apenaswaitpid()
nele (e em qualquer outro trabalho). Outros sinais de terminal, como^C
e^\
funcionam da mesma maneira. (meta: SE odeia que ctrl-barra invertida ..)