Como suspender e retomar processos como o bash

13

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+Zno 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 27980em outro terminal, ele imprime a linha [1]+ Stopped firefoxno 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?

lesmana
fonte
2
Consulte também Diferença entre grupo de processos e trabalho? .
Gilles 'SO- stop be evil'
Você deve adicionar pgidao seu pscomando para ver os grupos de processos sobre os quais o @geekosaur está falando.
Njalj

Respostas:

17

Os trabalhos da Shell vivem em "grupos de processos"; veja a PGRPcoluna na pssaí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 pspara determinar o grupo de processos, então 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 firefoxscript iniciado 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.

geekosaur
fonte
7
A propósito, bashnão está fazendo o SIGTSTPquando você digita ^Z; como firefoxo grupo de processos do grupo é o grupo de processos atual do terminal, o driver do terminal (pedanticamente, disciplina de linha) envia SIGTSTPtodos os processos nesse grupo de processos. bashestá apenas waitpid()nele (e em qualquer outro trabalho). Outros sinais de terminal, como ^Ce ^\ funcionam da mesma maneira. (meta: SE odeia que ctrl-barra invertida ..)
geekosaur