V tomto tutoriálu budeme hovořit o zabití procesu v Linuxu s několika příklady. Ve většině případů je to tak jednoduché, jako napsat příkaz „kill“ následovaný ID procesu (běžně zkracováno jako PID).
Jak můžete vidět, zabili jsme proces s ID 1813.
Pokud jste uživatelem Windows, může vám pomoci představit si příkaz „kill“ jako ekvivalent tlačítka „Ukončit úlohu“ v Linuxu ve správci úloh systému Windows.
Seznam běžících procesů
Příkaz „ps -e“ vypíše vše, co běží na vašem systému. I při minimální instalaci příkaz pravděpodobně vygeneruje více než 80 výsledků, takže je mnohem snazší převést příkaz do „grep“ nebo „more“.
ps -e | grep name-of-process
Na níže uvedeném snímku obrazovky zkontrolujeme, zda v systému běží SSH.
To nám také dává PID démona SSH, což je 1963.
Pokud si chcete prohlédnout běžící procesy vašeho systému jeden po druhém, přejděte na „více“.
Můžete také použít příkaz „top“, abyste viděli seznam běžících procesů. To je užitečné, protože vám ukáže, kolik systémových prostředků každý proces používá.
Zde je uvedeno PID, uživatel a název zdroje, což je užitečné, pokud se později rozhodnete některou z těchto služeb ukončit.
Věnujte pozornost sloupcům %CPU a %MEM, protože pokud si všimnete, že nedůležitý proces žvýká cenné systémové prostředky, pravděpodobně bude prospěšné ho zabít!
Dalším velmi efektivním způsobem získání odpovídajícího ID procesu je použití příkazu „pgrep“. Jediný argument, který musíte zadat, je název (nebo část názvu) běžícího procesu.
Zde je návod, jak to vypadá, když hledáme SSH. Jak můžete vidět, vrací ID procesu 2506.
Zabijte proces pomocí PID
Nyní, když známe PID démona SSH, můžeme proces zabít příkazem kill.
$ sudo kill 1963
Můžete zadat poslední příkaz „ps“, abyste se ujistili, že proces byl skutečně ukončen.
$ ps -e | grep ssh
Výsledky jsou prázdné, což znamená, že proces byl úspěšně ukončen. Pokud si všimnete, že proces pokračuje v běhu – což by se normálně stávat nemělo – můžete zkusit poslat procesu jiný signál pro ukončení, jak je popsáno v další relaci.
Poznámka:K ukončení procesu není vždy nutné použít „sudo“ nebo uživatelský účet root. V předchozím příkladu jsme ukončovali démona SSH, který je spuštěn pod uživatelem root. Proto musíme mít příslušná oprávnění k ukončení procesu.
Výchozí signál odeslaný příkazem kill
Ve výchozím nastavení příkaz kill odešle signál SIGTERM na proces, který určíte.
To by mělo umožnit bezproblémové ukončení procesu, protože SIGTERM řekne procesu, aby provedl své normální procedury vypnutí – jinými slovy, nenutí proces k náhlému ukončení.
To je dobrá věc, protože chceme, aby se naše procesy vypnuly tak, jak jsou zamýšleny.
Někdy však signál SIGTERM nestačí k zabití procesu. Pokud spustíte příkaz kill a všimnete si, že proces stále běží, proces možná stále prochází procesem vypínání nebo se úplně zavěsil.
Vynucené zabíjení
Chcete-li vynutit uzavření procesu a vyhnout se jeho normálnímu vypnutí, můžete odeslat signál SIGKILL pomocí přepínače -9, jak je znázorněno zde:
$ kill -9 processID
Může být lákavé vždy připojit přepínač -9 k příkazům zabíjení, protože to vždy funguje. Toto však není doporučený osvědčený postup. Měli byste jej používat pouze u procesů, které jsou zavěšené a odmítají se řádně ukončit.
Pokud je to možné, použijte výchozí signál SIGTERM. To zabrání chybám v dlouhodobém horizontu, protože to procesu dává možnost zavřít své soubory protokolu, ukončit všechna přetrvávající připojení atd.
Kromě signálů SIGTERM a SIGKILL existuje spousta dalších signálů, které může proces zabíjení poslat, a všechny lze vidět pomocí přepínače -l.
Čísla vedle jmen jsou to, co byste uvedli ve svém příkazu „zabít“. Například kill -9 je SIGKILL, stejně jako vidíte na obrázku výše.
Pro každodenní operace jsou SIGTERM a SIGKILL pravděpodobně jediné signály, které nikdy nebudete muset používat. Jen mějte na paměti ostatní pro případ, že se vyskytnou zvláštní okolnosti, kdy proces doporučuje ukončit proces jiným signálem.
Jak zabít všechny procesy podle názvu?
S příkazem pkill můžete také použít místo PID název běžícího procesu. Ale pozor, tím se ukončí vše procesy běžící pod zadaným názvem, protože kill nebude vědět, který konkrétní proces se pokoušíte ukončit.
$ pkill name-of-process
Podívejte se na příklad níže, kde ukončíme pět procesů jediným příkazem pkill.
V tomto příkladu jsme chtěli ukončit pouze jednu z těchto relací obrazovky; bylo by nutné zadat PID a použít normální příkaz „kill“. Jinak neexistuje způsob, jak jednoznačně specifikovat proces, který chceme ukončit.
Jak ukončit všechny procesy uživatelem?
Příkaz pkill můžete také použít k ukončení všech procesů, které jsou spuštěny uživatelem Linuxu. Nejprve, chcete-li zjistit, jaké procesy běží pod konkrétním uživatelem, použijte příkaz ps s přepínačem -u.
$ ps -u username
Tento snímek obrazovky nám ukazuje, že v současné době pod uživatelem „geek“ běží pět služeb. Pokud je potřebujete všechny rychle ukončit, můžete tak učinit pomocí pkill.
$ pkill -u username
Jak ukončit proces nohup?
Proces nohup můžete ukončit stejným způsobem jako jakýkoli jiný běžící proces. Všimněte si, že v příkazu ps nemůžete grep pro „nohup“, takže budete muset hledat běžící proces pomocí stejných metod, jak je uvedeno výše.
V tomto příkladu najdeme skript s názvem „test.sh“, který byl spuštěn pomocí příkazu nohup. Jak uvidíte, nalezení a ukončení je v podstatě stejné jako ve výše uvedených příkladech.
Jediný rozdíl oproti výstupu je v tom, že shell nás upozorní, že proces byl ukončen. To není součástí kill, ale spíše výsledkem spuštění skriptu na pozadí (v tomto příkladu ampersand) a připojení ke stejnému tty, ze kterého byl skript spuštěn.
$ nohup ./test.sh &
Jak spustit proces na pozadí?
Příkaz kill je účinný způsob, jak ukončit procesy, které běží na pozadí. V tomto tutoriálu jste se již naučili, jak zabíjet procesy, ale vědět, jak spustit proces na pozadí, je efektivní kombinace pro použití s příkazem kill.
Ke svému příkazu můžete připojit ampersand (&), aby byl proveden na pozadí. To je užitečné pro příkazy nebo skripty, jejichž provedení bude chvíli trvat a vy chcete mezitím provádět jiné úkoly.
Zde jsme na pozadí umístili jednoduchý příkaz „ls“. Vzhledem k tomu, že jde o typ příkazu, jehož provedení zabere velmi málo času, dostaneme více informací o tom, že dokončí svou práci hned poté.
Výstup na našem snímku obrazovky říká „Hotovo“, což znamená, že úloha na pozadí byla úspěšně dokončena. Pokud byste místo toho úlohu ukončili, ve výstupu by se zobrazilo „ukončeno“.
Úlohu můžete také přesunout na pozadí stisknutím Ctrl+Z na klávesnici. ^Z na tomto snímku obrazovky znamená, že jsme stiskli Ctrl+Z a skript test.sh se přesunul na pozadí.
Vydáním příkazu ps můžete vidět, že test.sh běží na pozadí.
$ ps -e | grep test.sh
Použití příkazu obrazovky
Dalším způsobem, jak spustit proces na pozadí, je použít příkaz „screen“. Funguje to tak, že se vytvoří něco, co v podstatě znamená samostatné okno terminálu (nebo obrazovka a odtud název).
Každá obrazovka, kterou vytvoříte, má své ID procesu, což znamená, že jde o efektivní způsob vytváření procesů na pozadí, které lze později ukončit pomocí příkazu kill.
Příkaz Screen není ve výchozím nastavení dodáván se všemi instalacemi Linuxu, takže jej možná budete muset nainstalovat.
Na Ubuntu a distribucích založených na Debianu jej můžete nainstalovat pomocí následujícího příkazu:
$ sudo apt-get install screen
Jakmile nainstalujete příkaz screen, můžete vytvořit novou relaci pouhým zadáním „screen“.:
$ screen
Než to však uděláte, je dobré si zvyknout určovat názvy obrazovek. Díky tomu je lze později snadno vyhledat a identifikovat. Vše, co potřebujete k zadání názvu, je přepínač -S.
$ screen -S my-screen-name
Udělejme obrazovku nazvanou „testování“ a pokusíme se ji ukončit příkazem „kill“. Začneme takto:
Po zadání tohoto příkazu a stisknutí klávesy Enter se okamžitě dostaneme na naši nově vytvořenou obrazovku. Zde můžete spustit proces, který chcete mít spuštěný na pozadí.
To je zvláště užitečné, pokud jste připojeni přes SSH na server a potřebujete, aby proces běžel i po odpojení.
Se spuštěným příkazem/skriptem se můžete odpojit od obrazovky stisknutím kláves Ctrl+A a poté D (před stisknutím klávesy D uvolněte klávesy Ctrl a A).
Jak můžete vidět, příkaz screen vypsal ID procesu, jakmile jsme odpojili obrazovku. Tuto obrazovku (a příkaz/skript běžící uvnitř) můžeme samozřejmě ukončit pomocí příkazu kill.
ID procesu relací obrazovky můžete snadno vyhledat pomocí tohoto příkazu:
$ screen -ls
Pokud bychom naši relaci obrazovky nepojmenovali pomocí přepínače -S, bylo by uvedeno pouze samotné ID procesu. Chcete-li se znovu připojit ke kterékoli z uvedených obrazovek, můžete použít přepínač -r:
$ screen -r name-of-screen
nebo
$ screen -r PID
Na níže uvedeném snímku obrazovky ukončujeme relaci obrazovky, kterou jsme vytvořili (spolu s tím, co je v ní spuštěno), a poté zadáváme další příkaz screen -ls, abychom ověřili, že proces skutečně skončil.
Jak ukončit proces na pozadí?
V jednom z našich příkladů v předchozí části jsme spustili náš skript tesh.sh na pozadí. Většina procesů na pozadí, zejména jednoduchých příkazů, bude ukončena bez jakýchkoli potíží.
Nicméně, stejně jako každý proces, může jeden na pozadí odmítnout snadné vypnutí. Náš skript test.sh má PID 2382, takže zadáme následující příkaz:
$ kill 2383
Na snímku obrazovky si však všimnete, že skript ignoroval náš příkaz kill:
Jak jsme se již naučili, kill -9 je nejlepší způsob, jak zabít proces, který je zavěšený nebo odmítá ukončit.
Jak ukončit zastavené procesy?
Může být užitečné zabít všechny zastavené úlohy na pozadí najednou, pokud se nashromáždily a již pro vás nejsou užitečné. Pro příklad spouštíme tři instance našeho skriptu test.sh na pozadí a byly zastaveny:
$ ./test.sh &
Tyto procesy můžete vidět pomocí příkazu ps:
$ ps -e | grep test.sh
Nebo chcete-li získat pouze seznam všech zastavených úloh v systému, můžete spustit příkaz jobs:
$ jobs
Nejjednodušší způsob, jak zrušit všechny zastavené úlohy, je pomocí následujícího příkazu:
$ kill `jobs -ps`
Nebo použijte přepínač -9 a ujistěte se, že úlohy skončí okamžitě:
$ kill -9 `jobs -ps`
Příkaz `jobs -ps` vypíše PID všech úloh spuštěných na pozadí, a proto jsme schopni zkombinovat jeho výstup s příkazem kill, abychom ukončili všechny zastavené procesy.
Ukončení operace není povoleno
Pokud se při pokusu o ukončení procesu zobrazuje chyba „operace není povolena“, je to proto, že nemáte správná oprávnění. Před příkazem kill se přihlaste k účtu root nebo použijte příkaz „sudo“ (v distribucích Debianu).
$ sudo kill PID
Doufám, že vám bude návod užitečný. Vraťte se.