Jaki jest cel opcji -9 w poleceniu kill?

Odpowiedzi:

28

Strona killpodręcznika użytkownika Ubuntu wyjaśnia cel -9przełączenia (co prawda w dość niepewny sposób):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Oto, co mówi inna strona podręcznika.

Polecenie killwysyła określony sygnał do określonego procesu lub grupy procesów. Jeśli nie określono żadnego sygnału, TERMsygnał jest wysyłany. TERMSygnał zabije procesów, które nie złapać ten sygnał. W przypadku innych procesów może być konieczne użycie sygnału KILL( 9), ponieważ sygnał ten nie może zostać przechwycony.


Dlatego użycie -9przełącznika gwarantuje, że proces zostanie skutecznie zabity. Nawet jeśli zamrożony lub niereagujący proces może nie reagować na prosty TERM sygnał, umrze po wysłaniu KILLsygnału.

SirCharlo
źródło
40

Polecenie kill wyśle ​​zdefiniowany sygnał do procesu o podanej tożsamości (PID):

kill -<signal> <pid>

Oczywiście możemy zabijać tylko procesy, które posiadamy, podczas gdy root może zabijać wszystkie procesy. Zobacz Wikipedię za miły podsumowanie sygnałów komputerowych.

Sygnały, które killmożna wysyłać, są wymienione na stronie podręcznika . Sygnał może być reprezentowany przez nazwę lub numer. Jeśli nie podano żadnego sygnału, domyślny sygnał 15 lub. TERMJest używane.

Wszystkie trzy poniższe polecenia są zatem identyczne:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Różnica pomiędzy SIGTERMi SIGKILLjest sposobem aplikacja może działać na sygnale:

  • TERM: aplikacja będzie mogła zakończyć działanie, tj. poprawnie uruchomić procedurę zamykania.
  • KILL: aplikacje są natychmiast zatrzymywane i zabijane (co może prowadzić do utraty danych lub zwiększenia prawdopodobieństwa zgłoszenia domniemanej awarii w niektórych przypadkach).
Takkat
źródło
16

Pamiętaj, że wszystkie następujące elementy są synonimami:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Warto zauważyć, że w świecie obsługi sygnałów SIGKILL jest jednym z niewielu unikalnych obsługiwanych przez system operacyjny, a nie program. Podczas uruchamiania kill -9nie nakazujesz aplikacji, aby się zakończyła, zamiast tego nakazujesz systemowi operacyjnemu, aby przestał uruchamiać program, bez względu na to, co program robi.

Po wysłaniu SIGKILL program zostanie natychmiast zatrzymany. Jeśli w imieniu programu są uruchomione jakieś wywołania jądra (np. File IO), mogą one, ale nie muszą, być kontynuowane, dopóki się nie zakończą, w zależności od wywołania, ale sam program nie będzie już działał. Zauważ, że śledzone zadania lub zadania uruchomione w debuggerze mogą zachowywać się tutaj inaczej.

Innym sygnałem, którego nie można zablokować, jest SIGSTOP, który ma podobny efekt, ale zamiast tego zawiesza program; możesz wysłać SIGCONT później, aby go wznowić. To zachowanie jest całkowicie kontrolowane przez system operacyjny, a program nie otrzymuje uprzedniego powiadomienia.

Wszystkie pozostałe sygnały są wysyłane do programu; poradzi sobie z nimi w dowolny sposób, lub jeśli zignoruje sygnał, wówczas zachowane zostanie zachowanie domyślne.

Oto kilka przydatnych sygnałów, które możesz wysłać do procesu:

  • SIGHUP - zawieszenie
    Informuje program, że użytkownik się rozłączył (np. Sesja SSH lub okno terminala zostało zamknięte).
    Zwykle wykonuje płynne zamknięcie programu.
  • SIGINT - przerwanie
    Wysyłane po naciśnięciu CTRL+ C
    Zazwyczaj oznacza „przestań robić” - może zabić program, ale nie musi
  • SIGTERM - zakończ
    Domyślne wysłane przez killi killall.
    Zwykle kończy program ... czasami po zakończeniu tego, co robi.
  • SIGSTOP - zatrzymaj
    Wysłane po naciśnięciu CTRL+ Z
    Wstrzymuje program, omówiony powyżej
  • SIGPIPE - potok zamknięty
    Informuje program, że potok został zamknięty. Zwykle kończy program.
    Na przykład cat /etc/passwd | head -n1wyśle ​​SIGPIPE do catprocesu po wydrukowaniu pierwszego wiersza, powodując catzakończenie przed zakończeniem całego pliku.

Chociaż wszystkie te sygnały występują „naturalnie” w ich własnych ustawieniach, możesz użyć tego sygnału, aby sfałszować warunek, aby osiągnąć pożądany rezultat.

Na przykład, jeśli chcesz zakończyć czyjąś sesję SSH, możesz po prostu zabić proces, ale w ten sposób zapobiegniesz aktualizacji pliku HISTORY, co może być ważne ze względów bezpieczeństwa. Ale zamiast tego, jeśli wyślesz go SIGHUP , proces zakłada, że ​​połączenie zostało przerwane i wykona standardowe czyszczenie.

tylerl
źródło
Ctrl + \ wysyła SIGQUIT, gdzie domyślną akcją jest zrzucenie rdzenia i zakończenie. Można tego użyć, jeśli program robi coś bardzo złego, musisz go natychmiast zatrzymać i chcesz móc go później debugować.
Simon Richter,
@SimonRichter Oh, masz rację. naprawiony.
tylerl
6

kill -9 Znaczenie: Proces zostanie zabity przez jądro; tego sygnału nie można zignorować. 9 oznacza sygnał KILL, którego nie można złapać ani zignorować

Wykorzystuje: SIGKILL singal

Kill Znaczenie: Polecenie kill bez żadnego sygnału przekazuje sygnał 15, co kończy proces w normalny sposób.

Wykorzystuje: sygnał SIGTERM , który może być obsługiwany przez programistów

devav2
źródło