Někdy je ukončení procesu jediným způsobem, jak se s ním vypořádat. I když výraz „zabití“ zní drsně, ve skutečnosti znamená jen to, že procesu nařídíte, aby se ukončil. V tomto článku si ukážeme, jak to udělat v terminálu Linuxu nebo macOS.
Co se rozumí pod pojmem proces?
Procesem je jakýkoli spuštěný program – ať už jde o webový prohlížeč, procesy běžící na pozadí vašeho desktopového prostředí, nebo systémové služby Linuxu.
Procesy lze rozdělit do dvou kategorií:
- Procesy v popředí: Jsou to programy, které spustil uživatel. Mohou být zobrazeny v okně terminálu nebo jako grafické aplikace.
- Procesy na pozadí: Tyto procesy se spouštějí automaticky a nevyžadují interakci s uživatelem. Nečekají na vstup a ani nezobrazují výsledky. Mezi procesy na pozadí patří například systémové služby a démoni.
Procesy v popředí by se daly přirovnat k hercům na jevišti, zatímco procesy na pozadí fungují jako „zákulisní“ tým.
Když se procesy chovají nesprávně, mohou začít nadměrně využívat procesor, spotřebovávat RAM, nebo se dostat do nekonečné smyčky a přestat reagovat. Grafické aplikace nereagují na kliknutí myší a terminálové aplikace vás nemusí vrátit na příkazový řádek.
Jak proces humánně ukončit?
„Zabití“ procesu v podstatě znamená „donucení procesu k ukončení“. To je nezbytné, pokud proces nereaguje.
Linux nabízí příkazy kill
, pkill
a killall
, které to umožňují. Tyto příkazy fungují pro všechny typy procesů, ať už grafických, nebo z příkazové řádky, běžících v popředí, nebo na pozadí.
Příkaz kill
K použití příkazu kill
potřebujete znát ID procesu (PID), který chcete ukončit. K vyhledání PID slouží příkaz ps
.
Pokud chcete vypsat všechny běžící procesy, použijte ps -e
. Výpis bude rozsáhlý, proto je doporučeno přesměrovat výstup do příkazu less
. Zadejte ps -e | less
a stiskněte Enter.
ps -e | less
Zobrazí se seznam procesů podobný tomu na následujícím snímku obrazovky. Pro vyhledávání použijte lomítko (/) pro hledání vpřed a otazník (?) pro hledání vzad.
Pro zúžení výsledků hledejte konkrétní proces pomocí kombinace ps
a grep
a zadejte název (nebo část názvu) procesu.
ps -e | grep shutter
Jakmile najdete PID požadovaného procesu, předáte jej příkazu kill
jako parametr. Například pro ukončení procesu se jménem „shutter“, jehož PID je 2099, použijte:
kill 2099
Příkaz kill
neposkytuje žádnou zpětnou vazbu, pokud byl úspěšný.
Příkaz pkill
Příkaz pkill
umožňuje ukončit procesy podle názvu, bez nutnosti znát PID. Jednoduše zadejte hledaný výraz, který pkill
použije k vyhledání procesů, a ty budou ukončeny. Proto je potřeba si být jistý, že hledaný výraz je správný.
Jako prevenci můžete použít příkaz pgrep
, který přijímá stejný hledaný výraz. Vypíše PID všech procesů, které odpovídají hledanému výrazu, ale neukončuje je. Než použijete pkill
, můžete si pomocí pgrep
ověřit, že hledaný výraz je přesný. pkill
a pgrep
zpracovávají hledaný výraz stejně. Dokonce mají stejnou manuálovou stránku.
Představme si proces s názvem „subq“. Příkaz ps -u dave | grep subq
nám ukáže jeho celý název.
ps -u dave | grep subq
Pokud uživatel nezná celý název procesu, ale ví, že obsahuje podřetězec „subq“, použije nejdříve pgrep
k ověření, zda je jen jedna shoda, a poté pkill
.
pgrep subq
pkill subq
Pomocí pkill
můžete ukončit i více procesů najednou. Následující příklad ukazuje, jak uživatel nejprve použije pgrep
pro zjištění počtu běžících procesů „chrome“, a poté všechny ukončí pomocí pkill
. Nakonec pomocí pgrep
ověří, že procesy byly skutečně ukončeny.
pgrep chrome
pkill chrome
pgrep chrome
Pokud běží více procesů se stejným názvem, ale nechcete je ukončit všechny, můžete pgrep
použít s volbou -f
(příkazový řádek) k jejich odlišení. Typickým příkladem jsou dva procesy „ping“. Jeden z nich chceme ukončit a druhý ne. K rozlišení použijeme příkazové řádky procesů, které můžeme zalomit do uvozovek.
pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"
Příkaz killall
Upozornění: V systémech Solaris a OpenIndiana příkaz killall
ukončí všechny procesy, které vlastníte. Pokud jste root nebo použijete sudo killall
, restartujete počítač! Toto chování bylo potvrzeno v nejnovější verzi OpenIndiana Hipster 2018.10.
Příkaz killall
funguje podobně jako pkill, ale s důležitým rozdílem. Místo hledaného výrazu, musíte zadat přesný název procesu.
Nelze zadat částečnou shodu názvu, musíte uvést celý název tak, jak je zobrazen:
killall shutt
killall shutter
Volba -y
(mladší než) umožňuje ukončit procesy, které byly spuštěny před kratší dobou, než je zadaná. Dobu udáváte číslem a jednotkou:
- s (sekundy)
- m (minuty)
- h (hodiny)
- d (dny)
- w (týdny)
- M (měsíce, velké „M“)
- y (roky)
Chcete-li ukončit proces s názvem „ana“, který byl spuštěn před méně než dvěma minutami a ponechat starší instance běžet, použijte:
killall -y 2m ana
Volba -o
(starší než) umožňuje ukončit procesy, které jsou spuštěné déle, než zadaná doba. Následující příkaz ukončí všechna ssh spojení, která jsou spuštěna déle než jeden den:
killall -o 1d sshd
Buďte opatrní
Tyto příkazy vám umožní přesně a bezpečně identifikovat a ukončit chybné procesy.
Vždy buďte opatrní. Ujistěte se, že proces, který se chystáte ukončit, je opravdu ten, který chcete. Dvakrát si ověřte, jestli je cílový proces ten správný. Až si budete jistí, pokračujte v ukončení procesu.