Cvičení – ukončení nesprávně se chovajícího procesu
Počítače nejsou dokonalé. Dříve nebo později se něco pokazí. Proto jste tu vy – správce systému. Vaším úkolem je odstranit a opravit potíže systému.
Představte si, že aplikace Pythonu způsobuje problémy. Možná zabírají příliš mnoho času procesoru nebo možná přestala reagovat. V obou případech chcete aplikaci zastavit. K identifikaci procesu nebo aplikace můžete použít ps
a grep
. K jeho zastavení potom můžete použít příkaz kill
. Pojďme si to procvičit na vašem virtuálním počítači se systémem Linux.
Spuštění nesprávně se chovajícího procesu
Pokud máte ukončit proces, budete potřebovat proces k ukončení. Pojďme ho vytvořit.
Vraťte se na domovskou bázi zadáním následujícího příkazu:
cd ~
V Azure Cloud Shellu zadejte následující příkaz ke spuštění linuxového editoru
vi
:vi bad.py
vi
je široce používaný textový editor, který Linux zdědil po systému Unix. Nemusí se vám to líbit, ale jako uživatel Bashe potřebujete znát základyvi
.Stisknutím klávesy i přepněte
vi
do režimu vkládání. Pak zadejte následující program Pythonu:i = 0 while i == 0: pass
Když je tento program spuštěný, běží v nekonečné smyčce – nic takového samozřejmě na serveru mít nechcete.
Pro ukončení režimu vkládání stiskněte klávesu Esc. Potom zadejte následující příkaz následovaný klávesou Enter k uložení programu a ukončení
vi
::wq
Nezapomeňte uvést příkaz dvojtečkou. Stejně jako u zbytku příkazu představuje
w
„write“ (psát) aq
„quit“ (ukončit).Teď použijte následující příkaz ke spuštění programu a nechte ho běžet na pozadí:
python3 bad.py &
Na konec příkazu nezapomeňte zadat ampersand (
&
). Jinak se nevrátíte do příkazového řádku Bashe. Ampersand spustí v Bashi příkaz a vrátí se do příkazového řádku, i když se příkaz nedokončil.
Není to zřejmé, ale bad.py teď běží na pozadí a bere cykly procesoru jiným procesům. Pojďme se podrobněji podívat na to, co se děje.
Ukončení procesu
Pokud chcete ukončit proces, budete potřebovat název procesu nebo ID procesu. S tímto úkolem si poradí příkaz ps
.
Osvěžme si paměť. Příkaz
ps -ef
zobrazí seznam všech spuštěných procesů a zobrazí o každém z nich spoustu informací. Pomocí následujícího příkazu můžete zobrazit seznam všech spuštěných procesů a vyfiltrovat výsledky na řádky, které obsahují slovo „python“:ps -ef | grep python
Výsledky by měly vypadat přibližně takto:
yourname+ 342 254 99 23:34 pts/1 00:00:31 python3 bad.py yourname+ 344 254 0 23:35 pts/1 00:00:00 grep --color=auto python
Podle výpisu to vypadá, že bad.py spotřebovává 99 % času procesoru serveru. Tento program nedělá svému jménu ostudu.
Příkaz
kill
ukončí běžící proces na základě jeho ID procesu. (Související příkaz s názvemkillall
ukončuje proces na základě názvu procesu.) Při voláníkill
musíte rozhodnout, jaký druh "signálu" použít k ukončení procesu. Pomocí následujícího příkazu zobrazte seznam typů signálů:kill -l
Pokud jste ukončovali proces démon – proces, který běží na pozadí a poskytuje nezbytné služby pro operační systém – můžete ho chtít ukončit a okamžitě ho znovu restartovat. K tomu můžete použít signál
SIGHUP
.V tomto příkladu chcete proces ukončit, aniž by se restartoval. Proto chcete použít signál
SIGKILL
, který odpovídá číslu 9. K tomuto účelu použijte ID procesu bad.py z výstupu příkazups -ef
(je ve druhém sloupci) a pomocí následujícího příkazu proces ukončete.PROCESS_ID
nahraďte ID procesu.kill -9 PROCESS_ID
Stejný příkaz můžete zadat také jako
kill -s SIGKILL PROCESS_ID
. Jestli použijete název nebo číslo signálu, záleží na vás.Postup dokončete opětovným spuštěním
ps
, abyste se ujistili, že bad.py už neběží.
Dalším běžným použitím příkazů ps
a kill
je identifikace a ukončení „zombie procesů“, což jsou podřízené procesy zapomenuté špatně napsanými programy.