it-swarm-eu.dev

Kdy bych neměl zabíjet proces?

Vždy jsem velmi váhal spustit kill -9, ale vidím, že ostatní administrátoři to dělají téměř rutinně.

Domnívám se, že existuje pravděpodobně rozumná střední půda, takže:

  1. Kdy a proč by měl kill -9 být použit? Kdy a proč ne?
  2. Co je třeba vyzkoušet před tím?
  3. Jaký druh ladění „zavěšeného“ procesu by mohl způsobit další problémy?
405
Mikel

Obecně byste měli použít kill (zkratka pro kill -s TERM nebo na většině systémů kill -15) před kill -9 (kill -s KILL) dát cílovému procesu šanci na vyčištění po sobě. (Procesy nemohou chytit nebo ignorovat SIGKILL, ale mohou a často to chytí SIGTERM.) Pokud nedáte procesu šanci dokončit to, co dělá a vyčistit, je to může nechat poškozené soubory (nebo jiný stav) kolem, že nebude schopen pochopit, jakmile restartujete.

strace/truss, ltrace a gdb jsou obecně dobré nápady, jak zjistit, proč je zaseknutý proces zaseknutý. (truss -u na systému Solaris je zvláště užitečné; ltrace příliš často předkládám argumenty pro volání z knihovny v nepoužitelném formátu.) Solaris má také užitečné /proc- založené nástroje, z nichž některé byly přeneseny do Linuxu. (pstack je často užitečný).

366
geekosaur

Randal Schwartz často zveřejňoval „zbytečné použití (x)“ na seznamech. Jeden takový příspěvek byl o kill -9. Obsahuje důvody a recept, který je třeba dodržovat. Zde je rekonstruovaná verze (citováno níže).

(Citace ohavnosti)

Ne ne ne. Nepoužívejte kill -9.

Nedává to procesu čistě šanci:

1) vypněte připojení zásuvky

2) vyčistěte dočasné soubory

3) informovat své děti, že odchází

4) resetovat jeho vlastnosti terminálu

a tak dále a tak dále a tak dále.

Obecně posílejte 15 a počkejte sekundu nebo dvě, a pokud to nefunguje, pošlete 2, a pokud to nefunguje, pošlete 1. Pokud to nefunguje, ODSTRANTE BINÁŘ, protože se program špatně chová!

Nepoužívejte kill -9. Nezvedejte kombajn, abyste uklidili květináč.

Jen další zbytečné použití Usenetu,

(.podpis)

230
Shawn J. Goff

Mělo by být vždy v pořádku dělat kill -9, stejně jako by to mělo být vždy v pořádku, aby se vypnul tahem za napájecí kabel. Může to být protispolečenské a ponechat nějaké uzdravení, ale mělo by to fungovat, a je to nástroj pro netrpělivé.

Říkám to jako někdo, kdo se nejprve pokusí o prosté zabití (15), protože dává programu šanci provést nějaké vyčištění - snad jen zápis do protokolu "opouští sig 15". Ale nepřijmu žádnou stížnost na špatné chování při zabití -9.

Důvod: spousta zákazníků dělá to, co programátoři dávají přednost, pak ne. Testování náhodného zabití -9 je dobrý a spravedlivý testovací scénář, a pokud to váš systém nezvládne, je váš systém nefunkční.

77
dbrower

Zabiják -9 používám téměř stejným způsobem, jakým hodím kuchyňské náčiní do myčky: pokud je kuchyňská linka zničena myčkou, pak to nechci.

Totéž platí pro většina programy (dokonce i databáze): pokud je nemůžu zabít, aniž by se věci staly haywire, opravdu je nechci používat. (A pokud náhodou použijete jednu z těchto neabsolvovaných databází, které vás povzbuzují, aby předstíraly, že přetrvávají data, když tak neučinily: dobře, myslím, že je čas začít přemýšlet o tom, co děláte).

Protože v reálném světě může věci z jakéhokoli důvodu kdykoli klesnout.

Lidé měli psát software, který je tolerantní k havárím. Zejména na serverech. Měli byste se naučit, jak navrhovat software, který předpokládá, že se věci rozbijí, havarují atd.

Totéž platí pro stolní software. Když chci vypnout prohlížeč, obvykle trvá vypnutí AGES. Má nic můj prohlížeč potřebuje to by mělo trvat déle než nanejvýš pár sekund. Když to požádám o vypnutí, mělo by se to podařit okamžitě. Když to tak není, tak vytáhneme zabití -9 a uděláme to.

39
borud

Ve všech ostatních odpovědích není uveden případ, kdy kill -9 Nefunguje vůbec, když je proces <defunct> A nelze jej zabít:

Jak mohu zabít proces <defunct>, jehož rodič je init?

Co je zaniklé pro proces a proč se nezabije?

Takže než se pokusíte kill -9, Proces <defunct> Spusťte ps -ef, Abyste viděli, co je jeho rodič, a zkuste -15 (TERM) nebo -2 (INT) a nakonec -9 (KILL) na jeho rodiče.

Poznámka: co ps -ef .

Pozdější úpravy a opatrnost: Postupujte opatrně při zabíjení procesů, jejich rodič nebo jejich děti, protože mohou nechat soubory otevřené nebo poškozené, spojení nedokončená, může dojít k poškození databáze atd., pokud nevíte, co kill -9 dělá pro proces, použijte jej pouze jako poslední možnost a pokud potřebujete spustit kill, použijte signály uvedené výše před použitím -9 (KILL)

10

Nikdy nikdy nedělejte kill -9 1. Vyhněte se také zabíjení určitých procesů, jako je mount. Když musím zabít spoustu procesů (řekněme například, že se relace X zavěsí a musím zabít všechny procesy určitého uživatele), obrátím pořadí procesů. Například:

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

Mějte na paměti, že kill nezastaví proces a neuvolní jeho zdroje. Všechno, co dělá, je poslat signál SIGKILL do procesu; mohli byste ukončit proces, který je zavěšen.

6
HandyGandy

Zabíjení procesů nechtěně není plynulý krok: data mohou být ztracena, špatně navržené aplikace se mohou rozbít jemnými způsoby, které nelze opravit bez opakované instalace .. ale zcela záleží na tom, co je a co není bezpečné v dané situaci. a co by bylo ohroženo. Uživatel by měl mít představu o tom, co proces dělá, nebo by měl dělat, a jaké jsou jeho omezení (disk IOPS, rss/swap) a měl by být schopen odhadnout, kolik času by měl trvat dlouho trvající proces (řekněme kopii souboru, kódování mp3, migrace e-mailů, zálohování, [váš oblíbený timesink zde].)

Navíc odeslání SIGKILL na pid není zárukou zabití. Pokud je zaseknutý v syscall nebo je již zombie (Z in ps), může to být i nadále zombie. Toto je často případ dlouhého běhu procesu ^ Z a zapomínání bg před pokusem o kill -9 to. Jednoduchý fg znovu připojí stdin/stdout a pravděpodobně odblokuje proces, obvykle následuje ukončení procesu. Pokud je uvízl někde jinde nebo v jiné formě zablokování jádra, může proces odstranit pouze restart. (Zombie procesy jsou již mrtvé poté, co je jádro zpracováno SIGKILL (nespustí se žádný další kód uživatelské země), obvykle existuje důvod jádra (podobný tomu, že je „blokováno“ čeká na dokončení syscall), protože proces není ukončení.)

Také, pokud chcete zabít proces a všechny jeho děti, zvykněte si volat kill pomocí negovaný PID, nejen samotný PID. Neexistuje žádná záruka SIGHUP, SIGPIPE nebo SIGINT nebo dalších signálů, které se po vyčištění vyčistí, a mít spoustu disowned procesů k vyčištění (pamatujte na kříženec?) Je nepříjemné.

Bonus zlo: kill -9 -1 je o něco škodlivější než kill -9 1 (Nedělejte jako root, pokud nechcete vidět, co se děje na odhozeném, nedůležitém VM)

5
dhchdhd

Vytvořil jsem skript, který pomáhá automatizovat tento problém.

Je založeno na mé úplné odpovědi 2 v otázce velmi podobné na stackoverflow .

Zde si můžete přečíst všechna vysvětlení. Pro shrnutí bych doporučil pouze SIGTERM a SIGKILL, nebo dokonce SIGTERM, SIGINT a SIGKILL. V úplné odpovědi však dávám více možností.

Prosím, klidně si jej stáhněte (klonujte) z githubu repozitář zabít1

3
Dr Beco

Proč nechcete kill -9 proces normálně

Podle man 7 signal:

Signály SIGKILL a SIGSTOP nelze zachytit, blokovat nebo ignorovat.

To znamená, že aplikace, která přijímá některý z těchto signálů, je nemůže „chytit“, aby provedla jakékoli chování při vypnutí.

Co byste měli udělat před spuštěním kill -9 na proces

Před odesláním signálu do procesu byste se měli ujistit, že:

  1. Zajistěte, aby proces nebyl zaneprázdněn (tj. „Pracujte“); odeslání kill -9 procesu v podstatě povede ke ztrátě těchto dat.
  2. Pokud je tento proces neodpovídající databází, ujistěte se, že nejprve propláchl mezipaměti. Některé databáze podporují odesílání dalších signálů do procesu, aby vynucily vyprázdnění mezipaměti.
3
user26053