Menu

Signály a jejich odchytávání

Signály jsou jedním ze způsobů (vedle např. standardního vstupu), jak může vnější prostředí komunikovat s procesem po dobu jeho běhu. Ve chvíli, kdy proces zachytí zaslaný signál, nastane přerušení jeho běhu – nejprve je obsloužen daný signál a poté teprve pokračuje běh programu tam, kde byl přerušen. Seznam všech signálů můžeme získat pomocí kill -l.

kill

Signály můžeme posílat programem kill. Syntaxe je kill [-signal] pid, kde signal je buď jméno, nebo číslo signálu a pid je číslo procesu (uložené v proměnné $$ a zjistitelné pomocí ps). Pokud neuvedeme číslo signálu, zašle se 15 SIGTERM. POSIX zaručuje existlenci následujících signálů:

1  SIGHUP    (hang up)
2  SIGINT    (interrupt)
3  SIGQUIT   (quit)
6  SIGABRT   (abort)
9  SIGKILL   (kill)
14 SIGALRM   (alarm)
15 SIGTERM   (terminate)

S některými z nich už jste se mohli setkat. Pokaždé, když ukončujete běžící program pomocí <Ctrl-C>, posíláte mu signál SIGINT, když ukončujete vstup pomocí <Ctrl-D>, posíláte SIGQUIT.

trap

Všechny výše zmíněné signály (kromě SIGKILL) můžeme odchytávat pomocí příkazu trap. To znamená, že zadefinujeme jakým způsobem se má přerušení zpracovat – např. při zavolání SIGINT můžeme nejdřív uložit rozdělanou práci a poté teprve program ukončit. Nebo jej dokonce můžeme ignorovat a neukončit se vůbec.

Syntaxe je trap 'příkazy' signály, kde signály jsou posloupností čísel nebo jmen příkazů, bez úvodního SIG. Pokud uvedeme trap '' TERM, signál se bude ignorovat.

Nesmíme zapomenout, že ve chvíli kdy odchytáváme signály sami, už se nezpracovávají standardním způsobem – tj. pokud si přejeme ukončit program, musíme to udělat sami příkazem exit.

SIGKILL je neodchytitelný signál. Každý proces můžete ukončit pomocí kill -9 pid. Na druhou stranu z toho plyne, že takový proces nemá šanci po sobě uklidit dočasné soubory apod., takže je vždycky lepší jít na něj po dobrém a poslat mu nejdříve SIGTERM.