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+Z
w bash, zawiesi firefox. Kiedy wydam polecenie bg
(lub fg
), wznowi firefox. To jest zgodne z oczekiwaniami.
Kiedy wydam polecenie kill -s SIGTSTP 27980
w innym terminalu, wypisze on linię [1]+ Stopped firefox
w 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?
źródło
pgid
do swojegops
polecenia, aby zobaczyć grupy procesów, o których mówi @geekosaur.Odpowiedzi:
Zadania powłoki działają w „grupach procesów”; spójrz na
PGRP
kolumnę w rozszerzonymps
wyjś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
ps
do ustalenia grupy procesówkill -s TSTP "-$pgrp"
. (Spróbujps -u"$USER" -opid,ppid,pgrp,cmd
.)W drzewie procesów grupa procesów rozpoczyna się od
firefox
skryptu uruchomionego przezbash
, więc grupa procesów to 27980, a polecenie tokill -s TSTP -27980
.Oczywiście, aby wznowić grupę procesów, problem
kill -s CONT -- -27980
.źródło
bash
nie robi to,SIGTSTP
kiedy piszesz^Z
; ponieważfirefox
grupa procesów jest bieżącą grupą procesów terminala, sterownik terminala (pedantycznie, dyscyplina liniowa) wysyłaSIGTSTP
do wszystkich procesów w tej grupie procesów.bash
jest po prostuwaitpid()
na nim (i innych zadaniach). Inne sygnały końcowe, takie jak^C
i^\
działają w ten sam sposób. (meta: SE nienawidzi tego ctrl-backslash ..)