Jak zawiesić i wznowić procesy takie jak bash

13

to pytanie jest kontynuacją: Jak zawiesić i wznowić procesy

Zacząłem firefox od sesji bash w gnome-terminal.

Drzewo procesów wygląda następująco:

$ 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

Kiedy uderzę CTRL+Zw bash, zawiesi firefox. Kiedy wydam polecenie bg(lub fg), wznowi firefox. To jest zgodne z oczekiwaniami.

Kiedy wydam polecenie kill -s SIGTSTP 27980w innym terminalu, wypisze on linię [1]+ Stopped firefoxw pierwszym terminalu (tak jak kiedy uderzyłem CTRL+Z), ale nie zawiesi firefoxa. Zakładam, że tylko zawiesza skrypt powłoki.

Kiedy wydam polecenie kill -s SIGTSTP 27989(zwróć uwagę na PID) w innym terminalu, zawiesi on firefox. Pierwszy terminal nie bierze tego pod uwagę.

W jaki sposób bash zawiesza całe drzewo procesów? czy po prostu przemierza drzewo i SIGTSTP wszystkie dzieci?

lesmana
źródło
2
Zobacz także Różnica między grupą procesów a zadaniem? .
Gilles „SO- przestań być zły”
Powinieneś dodać pgiddo swojego pspolecenia, aby zobaczyć grupy procesów, o których mówi @geekosaur.
ninjalj 17.03.11

Odpowiedzi:

17

Zadania powłoki działają w „grupach procesów”; spójrz na PGRPkolumnę w rozszerzonym pswyjściu. Są one używane zarówno do kontroli zadań, jak i do ustalenia, kto „jest właścicielem” terminala (rzeczywistego lub pty).

POSIX (pobrany z Systemu V) używa ujemnego identyfikatora procesu do wskazania grupy procesów, ponieważ grupa procesów jest identyfikowana przez pierwszy proces w grupie („lider grupy procesów”). Więc użyłbyś wtedy psdo ustalenia grupy procesów kill -s TSTP "-$pgrp". (Spróbuj ps -u"$USER" -opid,ppid,pgrp,cmd.)

W drzewie procesów grupa procesów rozpoczyna się od firefoxskryptu uruchomionego przez bash, więc grupa procesów to 27980, a polecenie to kill -s TSTP -27980.

Oczywiście, aby wznowić grupę procesów, problem kill -s CONT -- -27980.

geekozaur
źródło
7
Nawiasem mówiąc, bashnie robi to, SIGTSTPkiedy piszesz ^Z; ponieważ firefoxgrupa procesów jest bieżącą grupą procesów terminala, sterownik terminala (pedantycznie, dyscyplina liniowa) wysyła SIGTSTPdo wszystkich procesów w tej grupie procesów. bashjest po prostu waitpid()na nim (i innych zadaniach). Inne sygnały końcowe, takie jak ^Ci ^\ działają w ten sam sposób. (meta: SE nienawidzi tego ctrl-backslash ..)
geekozaur