W man page
napisane jest:
kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
pid... Specify the list of processes that kill should signal. Each pid can be one of five things:
0 All processes in the current process group are signaled
Próbowałem tak w bash:
$ man kill &
[1] 15247
$
[1]+ Stopped man kill
$ kill 0
$ ps
15247 pts/41 00:00:00 man
Tutaj 0
jest używany jako pid
. Jak zrozumiałem, kill 0
zabije wszystkie procesy w bieżącym procesie, który obejmuje pid15247
. Jednak w tym przykładzie nic nie zrobił. Czy ktoś ma pomysły, jak go używać?
process
kill
process-groups
Pistolet pożarowy
źródło
źródło
SIGTERM
do procesu, który wykonał.man
Polecenie wybrano je zignorować.ps -j
aby zobaczyć grupy procesów.kill -0
(uwaga na desce rozdzielczej), który jest inny temat, na StackOverflow i tutaj na Unix.SE .Odpowiedzi:
Jak mówi, wysyła sygnał do wszystkich członków grupy procesów dzwoniącego.
Grupy procesów służą do implementacji kontroli zadań w powłoce (można ich używać do innych celów, ale interaktywna kontrola zadań powłoki jest głównym powodem ich istnienia).
Zauważysz, że podczas pisania Ctrl-Cwszystkie procesy bieżących zadań są zabijane, nie tylko te, które je rozpoczęły. To również nie zabija zadań w tle.
Osiąga się to dzięki grupom procesów. Zadanie to grupa procesów uruchamianych przez powłokę, którą powłoka może umieścić w tle lub na pierwszym planie (ustawiona jako grupa procesów na pierwszym planie w terminalu lub nie) i zabić jako całość.
Możesz dowiedzieć się o identyfikatorach grup procesów i identyfikatorach sesji za pomocą
ps -j
(j
dla Jkontroli ob).Aby zabić grupę procesów PGID
$x
:kill 0
zabija grupę procesów dzwoniącego.Zauważ, że jeśli to zrobisz:
/bin/kill 0
powłoka rozpocznie nowe zadanie w celu wykonania tegokill
polecenia, więckill
tylko się zabije.kill
jest zwykle wbudowaną powłoką, więckill
zabije grupę procesów powłoki.Jednak gdy powłoka jest interaktywna, jest to grupa procesów zarządzająca procesami, więc zazwyczaj nie ma innego procesu w grupie procesów powłoki. Wszystkie procesy uruchomione przez powłokę znajdują się w innych grupach procesów:
Powyżej,
sleep
ips
to w dwóch różnych grup procesów, po jednym w tle, po jednym na pierwszym planie i są one różne od grupy procesu powłoki.Możesz zrobić:
Interaktywna powłoka uruchomiłaby nową grupę procesów dla tej podpowłoki, a zarówno podpowłoka, jak i man (oraz inne polecenia uruchomione przez man, takie jak pager, groff ...) byłyby w tej samej grupie procesów, więc
kill 0
działałyby tam. (sleep
powyższe ma dać wystarczająco dużo czasu na uruchomienie pagera, abyśmy mogli zobaczyć go naps -j
wyjściu, zanim go zabijemy).źródło
kill -- -$x
faktycznie mówibash: kill: (-63531) - No such process
w wersji bash 5.0.11 (1) na MacOS 10.14, ale jest pewne, że proces istnieje i działa.pkill -P
działa dobrzeps -j
aby dowiedzieć się o pgids