Z tego, co rozumiem, nie można złapać SIGKILL. Oznaczałoby to, że proces nie ma czasu na zabicie swoich dzieci, zanim system operacyjny je zniszczy. Można to wykazać za pomocą skryptu powłoki.
#! /bin/bash
trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.
mplayer video.avi
Zabicie go za pomocą SIGKILL pozostawia działającego mplayera.
$ kill -9 $pid
Ale podczas korzystania z emulatora terminali (xterm, Terminal, ...) dzieci zabijają się wraz z nim. Jak to jest możliwe?
$ mplayer
I zabij to:
$ kill -9 $terminal_pid
I mplayer idzie ze statkiem. Czy emulatory terminali w jakiś sposób łapią SIGKILL, czy też działa tu inna siła?
źródło
disown
którego jest bardzo przydatne.Odpowiedzi na twoje pytanie, dzieje się tak, ponieważ procesy te działają jako dzieci w emulatorze terminali. Zabijasz więc emulator terminala, a tym samym zabijasz wszystkie procesy potomne (ponieważ dzieci działają w tej samej grupie procesów, co kontrolujący emulator terminalu).
Zobacz na przykład:
Wszystkie te procesy działają w ramach procesów „xfce4-terminal”, więc jeśli zabiję ten proces, automatycznie zabije on wszystkie procesy potomne w grupie procesów ... w ten sam sposób, na przykład, wychodząc z okna emulatora terminala koniecznie zabij moje połączenie SSH.
Programy takie jak powłoki tworzą nowe grupy procesów, zwykle umieszczając powiązane procesy potomne w grupie. Każde zadanie jest grupą procesów. Poza jądrem powłoka manipuluje zadaniem, wysyłając sygnały do grupy procesów zadania za pomocą wywołania systemowego killpg, które dostarcza sygnał do wszystkich procesów w grupie procesów.
źródło
killpg
wywołania systemowego.Po pierwsze, nie mogę odtworzyć odtwarzacza mp, który przeżył zabity terminal, używając
xterm
.Powodem, dla którego umiera, jest to, że otrzymuje ZABYTEK po śmierci rodzica.
źródło