Cvičení – ukončení nesprávně se chovajícího procesu

Dokončeno

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á bere 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.

  1. Vraťte se na domovskou bázi zadáním následujícího příkazu:

    cd ~
    
  2. 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áklady vi.

  3. 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.

  4. 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) a q „quit“ (ukončit).

  5. 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.

  1. 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
    
  2. 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ázvem killall ukončuje proces na základě názvu procesu.) Při volání killmusí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
    
  3. 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říkazu ps -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.

  4. 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.