Como suspender e retomar processos como o bash faz

11

esta pergunta é uma continuação para: Como suspender e retomar processos

Eu iniciei o firefox de uma sessão 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 clicar em CTRL+Z no bash, ele suspenderá o firefox. Quando eu emito o comando bg (ou fg ), ele irá reiniciar o firefox. Isso é como esperado.

Quando eu emito o comando kill -s SIGTSTP 27980 em outro terminal, ele imprime a linha [1]+ Stopped firefox no primeiro terminal (assim como quando eu bato CTRL+Z ), mas ele não suspende o firefox. Eu suponho que apenas suspende o script de shell.

Quando eu emitir o comando kill -s SIGTSTP 27989 (observe o PID) em outro terminal, ele suspenderá o firefox. O primeiro terminal não toma nota disso.

Como o bash suspende toda a árvore de processos? faz apenas atravessar a árvore e SIGTSTP todas as crianças?

    
por lesmana 17.03.2011 / 19:53

1 resposta

15

Jobs da shell residem em "grupos de processos"; observe a coluna PGRP na saída ps estendida. Estes são usados tanto para controle de trabalho e para determinar quem "possui" um terminal (real ou pty).

POSIX (extraído do System V) usa um ID de processo negativo para indicar um grupo de processos, já que o grupo de processos é identificado pelo primeiro processo no grupo ("líder do grupo de processos"). Portanto, você usaria ps para determinar o grupo de processos e, em seguida, kill -s TSTP "-$pgrp" . (Tente ps -u"$USER" -opid,ppid,pgrp,cmd .)

Na sua árvore de processos, o grupo de processos começa com o script firefox lançado por bash , portanto, o grupo de processos seria 27980 e o comando seria kill -s TSTP -27980 .

Naturalmente, para retomar o grupo de processos, emita kill -s CONT -- -27980 .

    
por 17.03.2011 / 20:00