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:
- Kiedy i dlaczego należy
kill -9
stosować? Kiedy i dlaczego nie? - Co należy wypróbować przed zrobieniem tego?
- Jaki rodzaj debugowania „zawieszonego” procesu może powodować dalsze problemy?
Odpowiedzi:
Ogólnie rzecz biorąc, powinieneś używać
kill
(skrótkill -s TERM
lub w większości systemówkill -15
) przedkill -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
,ltrace
Igdb
są ogólnie dobre pomysły patrząc dlaczego zatrzymany proces jest zatrzymany. ( w systemietruss -u
Solaris jest szczególnie pomocny;ltrace
zbyt często prezentuję argumenty do wywołań biblioteki w bezużytecznym formacie). Solaris ma także przydatne/proc
narzędzia oparte na niektórych, z których niektóre zostały przeniesione do systemu Linux. (pstack
często jest pomocny).źródło
kill -9
ma 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.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).źródło
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.
źródło
kill -9
tak, 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 lubkill -9
nie 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.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.
źródło
W pozostałych odpowiedziach nie wspomniano o przypadku, w którym w
kill -9
ogó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 -9
w<defunct>
przebiegu procesups -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 -ef
robi .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 -9
robi 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)
źródło
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:Pamiętaj, że
kill
to nie zatrzymuje procesu i nie zwalnia jego zasobów. Wystarczy wysłać do procesu sygnał SIGKILL; możesz skończyć z zawieszonym procesem.źródło
kill -9 1
jest po prostu ignorowany w większości jednorożców. Nie ma potrzeby, aby uniknąćkill -9
zamount
, ale nie ma sensu w nim albo. Nie wiem, co rozumiesz przez „odwrócenie kolejności procesów”.kill -9
zatrzymuje 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 -9
zwalnia większość zasobów, ale nie wszystkie .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
SIGKILL
do pid nie gwarantuje zabicia go. Jeśli utknął w wywołaniu systemowym lub jest już zombie (Z
inps
), może nadal być zombie. Często dzieje się tak w przypadku długotrwałego procesu ^ Z i zapominania o nimbg
przed podjęciem próbykill -9
. Prostyfg
połą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 poSIGKILL
przetworzeniu 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
kill
z zanegowanym PID, a nie tylko z samym PID . Nie ma żadnej gwarancjiSIGHUP
,SIGPIPE
aniSIGINT
innych 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 -1
jest 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)źródło
Dlaczego nie chcesz
kill -9
normalnie procesuWedług
man 7 signal
: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 -9
procesuPrzed wysłaniem sygnału do procesu należy upewnić się, że:
kill -9
do procesu zasadniczo spowoduje utratę tych danych.źródło
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
SIGTERM
iSIGKILL
, lub nawetSIGTERM
,SIGINT
iSIGKILL
. Daję jednak więcej opcji w pełnej odpowiedzi.Proszę pobrać (sklonować) z repozytorium github, aby zabić 1
źródło