W jaki sposób możemy komunikować się z procesami ? Z procesami komunikujemy się wysyłając do nich tzw. sygnały. Sygnały mają przyporządkowane numery i nazwy, pisane – to jest informacja do zapamiętania – dużymi literami. Polecenie kill umożliwia wysyłanie różnych sygnałów zarówno do procesów pierwszo jak i drugoplanowych. Rodzaj sygnału jest określany przez jego numer lub nazwę. Proces do którego wysyłamy sygnał, jest oznaczany albo przez numer zadania użytkownika albo jego nazwę, jak pamiętamy numer ten poznajemy dzięki poleceniu jobs , albo przez jego systemowy identyfikator procesów PID (poznany dzięki poleceniom ps lub job -l). Listę sygnałów możemy wyświetlić na ekranie poprzez wydanie polecenia:
$ kill -l
Najczęściej interesują nas sygnały związane z przerywaniem, zatrzymywaniem i usuwaniem procesów:
SIGINT - sygnał nr. 2 - przerwanie wykonanie procesu wykonane przez użytkownika przy pomocy
klawiatury
SIGQUIT - sygnał nr. 3 - zakończenie wykonywania procesu wykonane przez użytkownika przy pomocy
klawiatury
SIGKILL - sygnał nr 9 - unicestwienie procesu, które bezwarunkowo kończy jego działanie. Nadawcą tego
sygnału musi być właścicielem procesu lub administratorem
SIGTERM - sygnał nr. 15 -
SIGSTOP - sygnał nr 19 - zatrzymanie wykonywania procesu, z możliwością późniejszego wznowienia jego
wykonywania. Po wydaniu polecenia jobs zatrzymany proces zostanie wpisany jako
„stopped”. Wznowienie pracy procesu uzyskujemy za pomocą poleceń fg lub bg
Powiążmy teraz kombinacje klawiszy i związane z nimi sygnały. Przy czym trzeba pamiętać, że kombinacje klawiszowe wysyłają sygnał tylko do bieżącego procesu uruchomionego na pierwszym planie. Jest to logiczne, ponieważ w tle możemy mieć uruchomionych wiele zadań.
CTRL + c → wysyła sygnał 2 (SIGINT)
CTRL + \ → wysyła sygnał 3 ; (SIGQUIT) na ekranie otrzymamy komunikat: Quit (core dumped)
CTRL + z → wysyła sygnał 19 (SIGSTOP) ; na ekranie otrzymamy komunikat typu [1]+ stopped, przy czym
liczba w nawiasach kwadratowych uruchamiając może być inna, w zależności od aktualnej liczby zadań
Przećwiczmy nabytą wiedzę o procesach i powiązanych z nimi zadaniach. Ponieważ wiemy, że wykonanie polecenia ls –R / trwa względnie długo, dlatego to właśnie używając je wielokrotnie nauczymy się stosowania poleceń kill fg jobs. Najpierw utwórzmy zbiór trzech zatrzymanych zadań ls –R / i natychmiast po wyegzekwowaniu zatrzymajmy je przy pomocy kombinacji CTRL+Z
$ ls –R /
CTRL+Z
[1] Stopped ls –R /
Powtórzmy polecenie jeszcze dwukrotnie tak aby uzyskać:
$ ls –R /
[1] Stopped ls –R /
[2] Stopped ls –R /
[3] Stopped ls –R /
Aby usunąć -stosujemy w tym przypadku sygnał nr 15 - zadanie nr 1 wykonujemy polecenie:
$ kill %1
[1] Terminated ls –R /
Wykonajmy teraz polecenie jobs:
$ jobs
[2] Stopped ls –R /
[3] Stopped ls –R /
Widzimy, że zadanie nr 1 zostało skasowane. Zauważmy, że argumentem polecenia kill jest %1 gdzie znak procent wskazuje, że podajemy numer zadania użytkownika, który jest podany w nawiasach kwadratowych po wykonaniu polecenia jobs, podczas gdy jedynka oznacza zadanie 1.
Zakończmy teraz – zabijmy – (sygnał nr 9) zadanie 2:
$ kill -9 %2
[2] Killed ls -R /
$ jobs
[3] Stopped ls –R /
Zostało ostatnie zadanie. Usuniemy je korzystne z bezwzględnej identyfikacji procesu PID, który poznamy egzekwując polecenie ps.
$ ps
PID TTY TIME CMD
10804 pts/1 0:20 bash
5304 pts/1 0:00 ls –R /
10804 pts/1 0:20 sed
5408 pts/1 0:00 ps
Jak widzimy numer procesu zadania ls –R / wynosi 5304, dlatego aby go unicestwić musimy wykonać następujące polecenie:
$ kill -9 5304
$ jobs
[3]+ Killed ls –R /
Znajomość mechanizmów związanych z procesami i zadaniami, ich usuwaniem czy unicestwianiem jest szczególnie cenna dla administratora systemu, np. dzięki tym poleceniom może on usuwać procesy użytkowników nad którymi stracono kontrolę.
Zarządzanie procesami i zadaniami Rozdział 8.2 Darmowy kurs Linux