Kiedy nie powinienem zabijać -9 procesu?


401

Zawsze bardzo się waham kill -9, ale widzę, że inni administratorzy robią to prawie rutynowo.

Wydaje mi się, że istnieje prawdopodobnie rozsądny środek, więc:

  1. Kiedy i dlaczego należy kill -9stosować? Kiedy i dlaczego nie?
  2. Co należy wypróbować przed zrobieniem tego?
  3. Jaki rodzaj debugowania „zawieszonego” procesu może powodować dalsze problemy?

Odpowiedzi:


362

Ogólnie rzecz biorąc, powinieneś używać kill(skrót kill -s TERMlub w większości systemów kill -15) przed kill -9( kill -s KILL), aby proces docelowy miał szansę oczyścić się po sobie. (Procesy nie mogą złapać lub zignorować SIGKILL, ale mogą i często łapią SIGTERM.) Jeśli nie dasz temu procesowi szansy na ukończenie tego, co robi i wyczyszczenia, może pozostawić uszkodzone pliki (lub inny stan) wokół tego po ponownym uruchomieniu nie będzie w stanie zrozumieć.

strace/ truss, ltraceI gdbsą ogólnie dobre pomysły patrząc dlaczego zatrzymany proces jest zatrzymany. ( w systemie truss -uSolaris jest szczególnie pomocny; ltracezbyt często prezentuję argumenty do wywołań biblioteki w bezużytecznym formacie). Solaris ma także przydatne /procnarzędzia oparte na niektórych, z których niektóre zostały przeniesione do systemu Linux. ( pstackczęsto jest pomocny).


67
ważnym powodem jest to, że jeśli przyzwyczaisz się do wysyłania SIGKILL, to kiedy przejdziesz do programu, który na przykład uszkodzi ważną bazę danych dla ciebie lub twojej firmy, naprawdę będziesz tego żałować. kill -9ma zastosowanie jako terminator w ostateczności, kładąc nacisk na ostateczność; administratorzy, którzy używają go przed ostatecznością a) nie rozumieją zbyt dobrze bycia adminem ib) nie powinni znajdować się w systemie produkcyjnym.
Arcege,

9
@Mikel Kolejną rzeczą do przejścia przez to, czasami najlepiej jest oszukać aplikację, aby oczyściła się z sygnału takiego jak SIGQUIT lub SIGSEGV, jeśli nie zareaguje na SIGINT / SIGTERM. Na przykład, pełnoekranowa aplikacja 3D lub nawet Xorg. Korzystając z SIGQUIT, nie będzie on w stanie niczego wyczyścić, ale podstępem do myślenia, że ​​zdarzyła się awaria segmentu, i poczuje, że nie ma innego wyjścia, jak oczyścić i wyjść.
penguin359,

12
@Arcege Czy uważasz, że korzystanie z bazy danych, która niszczy dane w przypadku zabicia przez -9, jest w końcu bazą danych wartą użycia? iirc, mysql, bdb, pg itd. ... wszystkie zachowują się dobrze po zabiciu z -9.
dhruvbird

13
killall -9 java ftw
dmourati

23
@dhruvbird: tylko dlatego, że twoje DB mają być wyposażone w kamizelki kuloodporne, nie oznacza, że ​​powinieneś je zastrzelić, jeśli nie musisz. Chociaż możesz mieć rację, że nie jest to tak ryzykowne, jak wydaje się mówić Arcege, myślę, że jego punkt widzenia nadal jest uzasadniony, że jest to ryzykowne i powinno być ostatecznością.
iconoclast

228

Randal Schwartz często publikował na listach „Bezużyteczne użycie (x)”. Jeden taki post był o kill -9. Zawiera powody i przepis do naśladowania. Oto zrekonstruowana wersja (cytowana poniżej).

(Cytat ohyda)

Nie nie nie. Nie używaj kill -9.

Nie daje to procesowi możliwości czystego:

1) zamknij połączenia gniazd

2) wyczyść pliki tymczasowe

3) poinformować dzieci, że wyjeżdża

4) zresetować charakterystykę terminala

i tak dalej i tak dalej i tak dalej.

Zasadniczo wyślij 15 i poczekaj sekundę lub dwie, a jeśli to nie zadziała, wyślij 2, a jeśli to nie zadziała, wyślij 1. Jeśli to nie zadziała, USUŃ BINARNOŚĆ, ponieważ program źle się zachowuje!

Nie używaj kill -9. Nie wyjmuj kombajnu tylko po to, by posprzątać doniczkę.

Kolejne bezużyteczne użycie sieci Usenet,

(.podpis)


12
Czy system operacyjny nie zamknie żadnych otwartych deskryptorów plików (w tym gniazd) po zakończeniu procesu?
Brian Gordon

3
Tak, to będzie. Ale załóżmy, że zabijasz proces serwera z połączonymi klientami, wtedy klienci nie zauważą, że serwer zniknął przed upływem limitów czasu.
Björn Lindqvist

45
Ach tak, stary argument „jeśli jest w jakikolwiek sposób niedoskonały, jesteś głupi, aby go użyć”.
Timmmm

3
Lub głupie, aby użyć, jeśli omawiany proces jest produkcją Twojej firmy
Warren P

3
Jeśli proces zostanie zabity, gniazdo wyśle ​​RST do peera, gdzie tak jakby proces wywoływał zamknięcie lub zamknięcie gniazda, wówczas gniazdo wysyła FIN. Limit czasu nie jest potrzebny. Sytuacja przekroczenia limitu czasu wystąpi tylko wtedy, gdy nastąpi spadek zasilania lub odłączenie kabla sieciowego.
ctrl-alt-delor

78

Powinno to zawsze być w porządku kill -9, podobnie jak zawsze powinno być w porządku wyłączenie poprzez wyciągnięcie kabla zasilającego. Może być antyspołeczny i pozostawia trochę do zrobienia, ale powinien zadziałać i jest narzędziem dla niecierpliwych.

Mówię to jako ktoś, kto najpierw spróbuje zwykłego zabicia (15), ponieważ daje to programowi szansę na pewne oczyszczenie - być może po prostu zapisanie do dziennika „wyjście z Sig 15”. Ale nie przyjmuję żadnych skarg dotyczących złego zachowania podczas zabójstwa -9.

Powód: wielu klientów robi to, co programiści wolą, a nie robią. Testy losowego zabicia -9 to dobry i uczciwy scenariusz testowy, a jeśli twój system go nie obsługuje, oznacza to, że jest zepsuty.


2
Jak testujesz pod kątem „losowego zabicia -9”? Kiedy zabijesz -9, jesteś skończony.
Karel Bílek

18
@Karel: Testujesz, czy Twój system może później odzyskać, i czyścisz wszelkie zniekształcone transakcje, które były przetwarzane w czasie SIGKILL.
Tadeusz A. Kadłubowski

7
Nie jest w porządku robić kill -9tak, jak wyciąganie wtyczki nie jest w porządku. Chociaż oczywiście zdarzają się sytuacje, w których nie masz wyboru, powinno to być działanie ostateczne. Oczywiście pociągnięcie za kabel zasilający lub kill -9nie powinno mieć negatywnych skutków, takich jak uniemożliwienie ponownego uruchomienia aplikacji lub systemu operacyjnego, jeśli w ogóle, ale dzieje się tak i używanie zalecanych sposobów ( kill [-15]) lub regularnego wyłączania pomoże uniknąć bałaganu, który może wystąpić, jeśli w ten sposób rutynowo przerywasz programy i systemy operacyjne. W każdym razie zawsze istnieje ryzyko utraty danych, niezależnie od odporności kodu.
jlliagre

7
Podejrzewam, że Michael miał na myśli „OK”, że twój program powinien poradzić sobie z tą sytuacją z wdziękiem i być w stanie wykonać jakąś formę czyszczenia po restarcie. Na przykład, czyszczenie plików PID i tak dalej, zamiast po prostu wyrzucać zabawki z wózka i odmawiać uruchamiania.
gerryk

2
@gerryk Powinni wprawdzie, ale problem polega na tym, że niektórzy uznają tę odpowiedź za „licencję na zabicie -9” niezależnie od sytuacji i środowiska. Jest to postawa nieodpowiedzialna.
jlliagre

39

Używam kill -9 w taki sam sposób, jak wrzucam przybory kuchenne do zmywarki: jeśli przybory kuchenne zostaną zniszczone przez zmywarkę, to nie chcę tego.

To samo dotyczy większości programów (nawet baz danych): jeśli nie mogę ich zabić bez szaleństwa, tak naprawdę nie chcę ich używać. (A jeśli zdarzy ci się skorzystać z jednej z tych baz danych, które zachęcają cię do udawania, że ​​utrwaliły dane, gdy tego nie robią: wydaje mi się, że nadszedł czas, abyś zaczął myśleć o tym, co robisz).

Ponieważ w prawdziwym świecie rzeczy mogą spaść w dowolnym momencie z dowolnego powodu.

Ludzie powinni pisać oprogramowanie odporne na awarie. W szczególności na serwerach. Powinieneś nauczyć się projektować oprogramowanie, które zakłada, że ​​coś się zepsuje, zawiesi itp.

To samo dotyczy oprogramowania komputerowego. Kiedy chcę wyłączyć przeglądarkę, zwykle trwa AGES. Nie ma nic moja przeglądarka musi to zrobić należy przyjmować więcej niż co najwyżej kilka sekund. Kiedy proszę o zamknięcie, powinien to zrobić natychmiast. Kiedy tak się nie stanie, wyciągamy zabicie -9 i robimy to.


4
Zgadzam się, że należy napisać proces tolerujący taką porażkę, ale myślę, że nadal jest to złą praktyką. Baza danych zostanie odzyskana, ale może wykryć niegrzeczne przerwanie, a następnie uruchomić znaczące sprawdzanie odzyskiwania po ponownym uruchomieniu. A co z żądaniami obsługiwanymi przez proces? Wszystkie zostaną natychmiast odcięte, klienci mogą mieć błędy, a także ponieść porażkę?
Daniel James Bryars

3
Baza danych, której nie można zabić w żadnym momencie, nie jest odpowiednio niezawodną bazą danych. Jest to dość podstawowy wymóg, jeśli potrzebujesz spójności. Jeśli chodzi o klientów: jeśli wpadną w szał i uszkodzą dane, gdy połączenie zostanie przerwane, są również źle zaprojektowane. Rozwiązaniem problemu utraty usługi jest nadmiarowość i automatyczne strategie przełączania awaryjnego / ponownej próby. Zwykle w przypadku większości awarii system jest szybszy niż próba odzyskania.
borud

4
@borud To może nie być idealnie napisane oprogramowanie, ale ludzie używają go przez cały czas. Jakim administratorom systemów przysługuje luksus polegający na tym, że zawsze mogą wybierać oprogramowanie, które jest idealnie napisane, a nawet odzyskać wdzięczność po nagłym zakłóceniu? Niewiele. Osobiście korzystam ze skryptów zamykających i uruchamiam / zatrzymuję procesy przez to. Jeśli nie odpowiedzą na skrypt zamykający (który odpowiednio sygnalizuje proces), zabijam -9.
Steve Sether,

2
Nie ma różnicy między gotowaniem podstawowych rzeczy a bardziej złożonymi potrawami w odniesieniu do narzędzi. Różnica polega na gotowaniu. (Jeśli jednak poświęcasz tyle samo czasu na gotowanie co ja, zdajesz sobie sprawę, że solidność jest minimalnym wymogiem w zakresie narzędzi kuchennych i że większość ludzi, którzy sprzedają artykuły kuchenne konsumentom, nie poznałaby złego narzędzia z doskonałego narzędzia.)
borud

1
Więc zachęcasz ludzi do niechlujstwa, ponieważ trudno jest właściwie robić rzeczy? Coraz więcej oprogramowania działa w środowiskach operacyjnych, które są efemeryczne. Jeśli napiszesz oprogramowanie, które robi się dziwaczne, jeśli nie zostanie poprawnie zamknięte, trudno będzie przekonać pracodawców do zatrudnienia cię jako programisty.
borud

10

W pozostałych odpowiedziach nie wspomniano o przypadku, w którym w kill -9ogóle nie działa, gdy proces jest <defunct>i nie można go zabić:

Jak mogę zabić <niedziałający> proces, którego rodzicem jest init?

Co nie działa w procesie i dlaczego nie zostaje zabity?

Zanim więc próbować kill -9w <defunct>przebiegu procesu ps -ef, aby zobaczyć, co jego rodzic jest i próba -15(TERM) lub -2(INT) i wreszcie -9(kill) na jego rodzica.

Uwaga: co ps -efrobi .

Późniejsza edycja i ostrożność: zachowaj ostrożność podczas zabijania procesów, ich rodziców lub dzieci, ponieważ mogą pozostawić pliki otwarte lub uszkodzone, połączenia niedokończone, mogą uszkodzić bazy danych itp., Chyba że wiesz, co kill -9robi dla procesu, używaj go tylko w ostateczności , a jeśli chcesz uruchomić kill, użyj sygnałów określonych powyżej przed użyciem-9 (KILL)


6

Nigdy nie rób kill -9 1. Unikaj także zabijania niektórych procesów, takich jak mount`. Kiedy muszę zabić wiele procesów (np. Zawiesić sesję X i muszę zabić wszystkie procesy danego użytkownika), odwracam kolejność procesów. Na przykład:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Pamiętaj, że killto nie zatrzymuje procesu i nie zwalnia jego zasobów. Wystarczy wysłać do procesu sygnał SIGKILL; możesz skończyć z zawieszonym procesem.


1
Głos był kimś innym. Ale które zasoby nie są uwalniane? Czy masz na myśli, że proces nie może wykonać normalnego czyszczenia? Co z blokadami plików, semaforami itp.? Czy możesz rozwinąć?
Mikel

Wygląda na to, że pamięć współdzielona SysV i semafory będą musiały zostać przynajmniej wyczyszczone. archives.postgresql.org/pgsql-general/2006-10-10/msg01065.php
Mikel

8
Ta odpowiedź jest po części myląca, a po części błędna. kill -9 1jest po prostu ignorowany w większości jednorożców. Nie ma potrzeby, aby uniknąć kill -9za mount, ale nie ma sensu w nim albo. Nie wiem, co rozumiesz przez „odwrócenie kolejności procesów”. kill -9zatrzymuje proces (jak w trybie „zabij”), nie dając mu szansy na zażalenie, jednak zabijanie nie nastąpi natychmiast, jeśli proces jest wykonywany w sposób nieprzerywalny . Zabicie procesu za pomocą kill -9zwalnia większość zasobów, ale nie wszystkie .
Gilles,

5

Zabijanie procesów chcąc nie chcąc, nie jest płynnym ruchem: dane mogą zostać utracone, źle zaprojektowane aplikacje mogą się zepsuć w subtelny sposób, którego nie można naprawić bez ponownej instalacji .. ale całkowicie zależy to od wiedzy, co jest, a co nie jest bezpieczne w podana sytuacja. i co byłoby zagrożone. Użytkownik powinien mieć pojęcie, czym jest lub powinien być proces i jakie są jego ograniczenia (IOPS dysku, rss / swap) i być w stanie oszacować, ile czasu powinien zająć proces długotrwały (np. Kopia pliku, ponowne kodowanie mp3, migracja poczty e-mail, tworzenie kopii zapasowych [Twój ulubiony czas tutaj].)

Ponadto przesłanie SIGKILLdo pid nie gwarantuje zabicia go. Jeśli utknął w wywołaniu systemowym lub jest już zombie ( Zin ps), może nadal być zombie. Często dzieje się tak w przypadku długotrwałego procesu ^ Z i zapominania o nim bgprzed podjęciem próby kill -9. Prosty fgpołączy ponownie stdin / stdout i prawdopodobnie odblokuje proces, zwykle następnie następuje zakończenie procesu. Jeśli utknie gdzie indziej lub w jakiejś innej formie zakleszczenia jądra, tylko ponowne uruchomienie może być w stanie usunąć proces. (Procesy zombie są już martwe po SIGKILLprzetworzeniu przez jądro (nie uruchamia się dalszy kod użytkownika), zwykle istnieje powód jądra (podobny do „zablokowania” oczekiwania na zakończenie połączenia systemowego), aby proces się nie zakończył.)

Ponadto, jeśli chcesz zabić proces i wszystkie jego dzieci, nawyk dzwonienia killz zanegowanym PID, a nie tylko z samym PID . Nie ma żadnej gwarancji SIGHUP, SIGPIPEani SIGINTinnych sygnałów, które po nim wyczyszczą, a posiadanie wielu odrzuconych procesów do czyszczenia (pamiętasz kundla?) Jest denerwujące.

Bonusowe zło: kill -9 -1jest nieco bardziej szkodliwe niż kill -9 1(nie rób tego jako root, chyba że chcesz zobaczyć, co się dzieje na wyrzucanej, nieistotnej maszynie wirtualnej)


3

Dlaczego nie chcesz kill -9normalnie procesu

Według man 7 signal:

Sygnałów SIGKILL i SIGSTOP nie można złapać, zablokować ani zignorować.

Oznacza to, że aplikacja, która odbiera którykolwiek z tych sygnałów, nie może ich „złapać”, aby wykonać jakiekolwiek działanie związane z zamykaniem.

Co powinieneś zrobić przed uruchomieniem kill -9procesu

Przed wysłaniem sygnału do procesu należy upewnić się, że:

  1. Upewnij się, że proces nie jest zajęty (tj. Wykonując „pracę”); wysłanie kill -9do procesu zasadniczo spowoduje utratę tych danych.
  2. Jeśli proces nie odpowiada na bazę danych, upewnij się, że najpierw wyczyścił pamięć podręczną. Niektóre bazy danych obsługują wysyłanie innych sygnałów do procesu w celu wymuszenia opróżnienia pamięci podręcznej.

3

Stworzyłem skrypt, który pomaga zautomatyzować ten problem.

Opiera się na mojej pełnej odpowiedzi 2 w pytaniu bardzo podobnym przy przepełnieniu stosu .

Możesz przeczytać wszystkie wyjaśnienia tam. Podsumowując polecam tylko SIGTERMi SIGKILL, lub nawet SIGTERM, SIGINTi SIGKILL. Daję jednak więcej opcji w pełnej odpowiedzi.

Proszę pobrać (sklonować) z repozytorium github, aby zabić 1

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.