Dlaczego numer 9 w poleceniu kill -9 w systemie UNIX? [Zamknięte]

101

Rozumiem, że to nie na temat, nie mogłem znaleźć nigdzie w Internecie i pomyślałem, że może guru programowania w społeczności mogą to wiedzieć.
Zwykle używam

kill -9 pid

zabić robotę. Zawsze zastanawiałem się, skąd pochodzi 9. Wyszukałem to w Internecie i jest napisane

„9 oznacza sygnał KILL, którego nie można złapać ani zignorować. Innymi słowy, sygnalizowałoby to natychmiastowe zakończenie procesu (niektóre uruchomione aplikacje)” (źródło: http://wiki.answers.com/Q/What_does_kill_-9_do_in_unix_in_its_entirety )

Ale dlaczego 9? a co z innymi liczbami? czy jest jakieś znaczenie historyczne lub ze względu na architekturę Uniksa?

Alby
źródło
6
Myślę, że to pytanie lepiej należy do superuser.com
Rafał Rawicki

Odpowiedzi:

89

Zobacz artykuł Wikipedii o sygnałach Unix, aby zapoznać się z listą innych sygnałów. SIGKILL po prostu przypadkiem otrzymał numer 9.

Możesz równie dobrze używać mnemoników, jak liczb:

kill -SIGKILL pid
Rafał Rawicki
źródło
6
Kiedyś (przez co mam na myśli 4.xBSD lub coś podobnego) nie można było używać mnemoników z poleceniem powłoki, dlatego cyfra 9 jest zapisana w bardzo wielu starych, zakurzonych skryptach powłoki.
zwol
72

Było 8 innych sygnałów, które wymyślili jako pierwsi.

Jonathon Reinhart
źródło
50

Myślę, że lepszą odpowiedzią jest po prostu to:

mike@sleepycat:~☺  kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP  
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

Jeśli chodzi o „znaczenie” 9 ... powiedziałbym, że prawdopodobnie nie ma żadnego. Zgodnie z The Linux Programming Interface (s. 388) :

Każdy sygnał jest definiowany jako unikalna (mała) liczba całkowita, rozpoczynająca się sekwencyjnie od 1. Te liczby całkowite są zdefiniowane w symbolicznych nazwach w postaci SIGxxxx. Ponieważ rzeczywiste liczby używane dla każdego sygnału różnią się w różnych implementacjach , to właśnie te nazwy symboliczne są zawsze używane w programach.

mikewilliamson
źródło
32

Najpierw musisz wiedzieć, czym są sygnały w systemach uniksopodobnych (zajmie to tylko kilka minut).

Sygnały to przerwania programowe wysyłane do (uruchomionego) programu w celu wskazania, że ​​wystąpiło ważne zdarzenie.

Zdarzenia mogą się różnić, od żądań użytkowników po nielegalne błędy dostępu do pamięci. Niektóre sygnały, takie jak sygnał przerwania, wskazują, że użytkownik poprosił program o zrobienie czegoś, co nie znajduje się w zwykłym przepływie sterowania.

Istnieje kilka typów Sygnałów, których możemy użyć - aby uzyskać pełną listę wszystkich dostępnych / możliwych Sygnałów, użyj polecenia " $ kill -l ": wprowadź opis obrazu tutaj

Na powyższym wyjściu widać wyraźnie, że każdy Sygnał ma powiązany z nim „ numer sygnału ” (np. 1, 2, 3) i „ nazwę sygnału ” (np. SIGUP, SIGINT, SIGQUIT). Aby uzyskać szczegółowe informacje o tym, co robi każdy Signal, odwiedź ten link .

Na koniec, przechodząc do pytania „Dlaczego numer 9 w poleceniu kill -9 ”:

Istnieje kilka metod dostarczania sygnałów do programu lub skryptu. Jedną z powszechnie stosowanych metod wysyłania sygnału jest użycie polecenia kill - podstawowa składnia to:

$ kill -signal pid

Gdzie sygnał to numer lub nazwa sygnału, po którym następuje identyfikator procesu (pid), do którego sygnał zostanie wysłany.

Na przykład - -SIGKILL (lub -9 ), sygnał natychmiast zabija proces.

$ kill -SIGKILL 1001

i

$ kill -9 1001

obie komendy są tym samym, tzn. powyżej użyliśmy „nazwy sygnału”, a później „numeru sygnału”.

Werdykt : jeden ma otwarty wybór, czy użyć „nazwy sygnału” czy „numeru sygnału” z poleceniem zabicia .

Nabeel Ahmed
źródło
19

To nawiązanie do „Revoulution 9” The Beatles. Zbiór połączonych ze sobą klipów dźwiękowych i znalezionych dźwięków, w tym nagraniu John Lennon powtarza w kółko „Numer 9, Numer 9…”. Ponadto, ta piosenka przyciągnęła uwagę w 1969 roku, kiedy odkryto, że odtwarzany od tyłu John wydawał się mówić „Podkręć mnie, trupie ...”

Dlatego dziewiąty sygnał miał być najbardziej śmiercionośnym z sygnałów zabijania.

Stairbob
źródło
17
Naprawdę nie mogę powiedzieć, czy wyciągasz to ze swojego tyłka, czy jest szansa, że ​​to prawda.
Jonathon Reinhart
Zakończenie tego tematu jest naprawdę epickie, szczególnie dwa komentarze przed moim. Natknąłem się również na ten artykuł o zabijaniu i sekwencji, której należy użyć: pthree.org/2012/08/14/norm-use-of-kill-9-pid
Gull_Code,
Tak bardzo chcę, żeby to była prawda ... :)
nafas
Osoba mówiąca „numer 9” to nie Lennon. Podejrzewam, że w pozostałej części historii jest tyle samo prawdy (tj. Żadnej), ale kto wie :)
Stephen Kennedy
8

Istnieje bardzo długa lista sygnałów uniksowych, które można przeglądać w Wikipedii . Nieco mylące, możesz faktycznie użyć killdo wysłania dowolnego sygnału do procesu. Na przykład kill -SIGSTOP 12345wymusza na procesie 12345 wstrzymanie wykonywania, a jednocześnie kill -SIGCONT 12345nakazuje wznowienie. Nieco mniej tajemnicza wersja kill -9to kill -SIGKILL.

Lawrence Velázquez
źródło
2
Nazywa się również bazowe wywołanie systemowe, które wysyła sygnały kill. Prawdopodobnie dlatego, że domyślnym zachowaniem dla większości pierwotnego zestawu sygnałów (numery od 1 do 15) było zakończenie procesu.
zwol
4

Nie sądzę, aby cyfra 9. miała jakiekolwiek znaczenie. Ponadto, wbrew powszechnemu przekonaniu, killsłuży nie tylko do zabijania procesów, ale także do wysyłania sygnału do procesu. Jeśli jesteś naprawdę ciekawy, możesz przeczytać tutaj i tutaj .

Ilia Frenkel
źródło
3

dlaczego zabić -9: numer 9 na liście sygnałów został wybrany jako SIGKILL w odniesieniu do „zabicia 9 żyć kota”.

LaFleche78
źródło
3

SIGKILLużyj, aby zabić proces. SIGKILLnie można zignorować ani obsłużyć. W Linuksie sposoby dawania SIGKILL.

kill -9 <process_pid> 
kill -SIGKILL <process_pid> 
killall -SIGKILL <process_name>
killall -9 <process_name>
KeyMaker00
źródło
1

Wpisz polecenie kill -l w powłoce

dowiesz się, że pod numerem 9 [ 9) SIGKILL ], więc można użyć kill -9 lub kill -SIGKILL

SIGKILL to z pewnością sygnał zabicia, nie można go przestawiać, ignorować ani obsługiwać. Zawsze działa z domyślnym zachowaniem, które polega na zabiciu procesu.

Sandeep_black
źródło
1

Jest -9to numer_sygnału i określa, że ​​wysłany komunikat o zabiciu powinien być typu KILL (nie do przechwycenia, nie do zignorowania).

kill -9 pid

Który jest taki sam jak poniżej.

kill -SIGKILL pid

Bez określenia signal_number domyślną wartością jest -15, czyli TERM (sygnał zakończenia oprogramowania). Wpisywanie kill <pid>jest takie samo jak kill -15 <pid>.

Harini
źródło
0

Oba są takie same, jak kill -sigkill identyfikator procesu, kill -9 identyfikator procesu. Zasadniczo służy do wymuszonego zakończenia procesu.

Abhilash TC
źródło
0

jest jakiś proces, którego nie można zabić, jak to "zabij% 1". jeśli musimy zakończyć ten proces, używana jest specjalna komenda do zabicia tego procesu, czyli kill -9. np. otwórz vim i zatrzymaj się, jeśli używając ctrl + z, zobacz zadania i po zastosowaniu procesu kill ten proces nie zostanie zakończony, więc tutaj używamy polecenia kill -9 do zakończenia.

Usman
źródło