2 Podstawowe polecenia

2.7 Procesy

System UNIX pozwala na uruchomienie wielu procesów działających równocześnie.
Wydanie polecenia zazwyczaj uruchamia proces na pierwszym planie, chcąc uruchomić kolejny program użytkownik musi zaczekać na zakończenie działającego procesu.
Istnieje możliwość uruchomienia wielu procesów działających w tle. Powłoka uruchomi proces w tle jeśli na końcu polecenia dodamy &.
Przykład:
$ sleep 100 &
P olecenie sleep uruchamia proces który nic nie robi i kończy działanie po określonej liczbie sekund.
Do działającego procesu można wysłać sygnał aby zakończył swoje działanie albo się zatrzymał.
W przypadku działającego na pierwszym planie programu można:
- zakończyć działanie procesu wciskając Ctrl+C
- zatrzymać proces wciskając Ctrl+Z, proces można wówczas przywrócić do działania w tle lub na pierwszym planie za pomocą poleceń powłoki bg i fg.

2.7.1 Najważniejsze polecenia

ps

podaje informacje o działających procesach
Postać: ps [opcje]

Opcje polecenia ps moga byc podawane w różnej formie: poprzedzone myślnikiem (w stylu UNIX) np. ps -l, bez myślinika (styl BSD), np. ls aux lub poprzedzone dwoma myślnikami (styl GNU), np. ps --help. W razie niepewności zajrzyj do dokumentacji man ps.
Najważniejsze opcje:
-l wyświetla więcej informacji o procesach
-f format ekstra-pełny
-A lub e wszystkie procesy
-U numer_użytkownika lub U, lub --user procesy uruchomione przez danego użytkownika
u format zorientowany na użytkownika
f wyświetl drzewo procesów

Przykład:
$ ps

PID TTY          TIME CMD
3873 pts/2    00:00:00 su
3875 pts/2    00:00:00 bash
3893 pts/2    00:00:00 tcsh
3899 pts/2    00:00:00 vim
3904 pts/2    00:00:00 ps

PID (ang. Process ID) jest liczbą jednoznacznie identyfikującą proces w systemie. TTY to nazwa terminala z którego zostało uruchomione polecenie CMD.

$ ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S  1002  3873  3211  0  76   0 -   710 wait   pts/2    00:00:00 su
0 S  1002  3875  3873  0  75   0 -  1271 wait   pts/2    00:00:00 bash
0 S  1002  3893  3875  0  75   0 -   908 rt_sig pts/2    00:00:00 tcsh
0 T  1002  3899  3893  0  78   0 -   997 finish pts/2    00:00:00 vim
0 R  1002  3945  3893  0  76   0 -   581 -      pts/2    00:00:00 ps

Oznaczenia: UID - numer użytkownika, PPID - numer procesu rodzica (procesu z którego wywodzi się dany proces), PRI - priorytet, NI - wartość parametru NICE ustawianego poleceniem nice

top

lista procesów w czasie rzeczywistym
Postać: top [opcje]
Polecenie top prezentuje listę działających procesów wraz z najważeniejszymi informacjami na temat obciążenia systemu (zajętość pamięci i obciążenie CPU). Program udostępnia wiele skrutów klawiszoych pozwalających na sortowanie i filtrowanie listy procesów:

  • h

    wyświetla listę skrótów klawiszowych

  • k zabija wskazany proces

  • r zmienia parametr NICE wskazanego proesu

  • f wybór pól prezentujących informacje o procesach

  • q wyjście z programu

Polecenie:
$ top -u username
wyświetla listę procesów wskazanego użytkonika.

htop

lista procesów w czasie rzeczywistym
Postać: htop [opcje]
Jest to bardizej przyjazna dla użytkownika wersja programu top

pstree

wyświetla drzewo procesów
Postać: pstree [opcje]
Najważniejsze opcje:
-p dodaje numery PID
-H PID wyróżnia podany proces (-h aktualny proces)

kill

zabija proces
Postać: kill [-sygnal] PID...
Polecenie wysyła sygnał do procesu o numerze PID. Jeżeli nie sprecyzujemy rodzaju sygnału wówczas kill wysyła sygnał SIGINT przerywający działanie procesu.
Opcja -l wyświetla listę sygnałów jakie można przesłać do procesów (więcej na ten temat w dokumentacji man 7 signal)
Najważniejsze sygnały:
2 SIGINT przerwanie procesu (ten sygnał jest wysyłany do procesu gdy wciśniemy Ctrl+C)
9 SIGKILL sygnał “zabicia” procesu
19 SIGSTOP zawieszenie procesu (Ctrl+Z)
18 SIGCONT wznowienie zatrzymanego procesu
$ kill -9 3899
wysyła sygnał KILL o numerze 9 do podanego procesu
$ kill -9 -1
wysyła sygnał KILL do wszystkich procesów (uwaga: spowoduje wylogowanie, gdyż zamknięty zostanie także proces powłoki)
$ kill -SIGSTOP 4008
zawiesza działanie procesu
$ kill -18 4008
wznawia działanie zawieszonego procesu
Wbudowanw w powłokę Bash polecenie kill umożliwia dodatkowo wystyłanie sygnałów do procesów identyfikowanych za pomocą numeru zadania JID (zobacz polecenie jobs)

killall

zabija procesy o podanej nazwie
Postać: killall [-s sygnal] nazwa ...
Przykład:
$ killall sleep

pgrep

wyświetla numery PID procesów pasujących do wzorca
Postać: pgrep [opcje] wyrażenie
Najważniejsze opcje:
-u użytkownik zawęża wyniki tylko do procesów danego użytkownika.
-l dodaj informację o nazwie procesu
Przykład:
$ pgrep -u marek sleep
wyświetli numery procesów uruchomionych przez użytkownika marek zawierających w nazwie sleep.
$ kill -9 $(pgrep -u marek sleep)
wyśle syknał SIGKILL do procesów uruchomionych przez użytkownika marek zawierających w nazwie sleep.

pkill

wysyła sygnał do procesów o nazwach pasujących do wzorca
Postać: pgrep [-sygnał] [opcje] wyrażenie
Polecenie to rozszerza działanie pgrep o możliwość wysłania sygnału do pasujących procesów.
Przykład:
$ pkill -9 -u marek sleep
wyśle sygnał SIGKILL do procesów uruchomionych przez użytkownika marek zawierających w nazwie sleep.

jobs

podaje status procesów uruchomionych w bieżącej powłoce
Postać: jobs [-l]
Przykład:
$ jobs

[1]-  Done                    sleep 100
[2]+  Stopped                 vim

W nawiasie kwadratowym podany jest numer zadania JID (ang. Job ID), obok stan procesu (zatrzymany, uruchomiony, itp.).
Opcja -l wyświetla dodatkowo PID procesu.

bg

uruchamia zawieszone zadanie w tle
Postać: bg [JID…]

Gdy nie podano numery zadania to wznawiane jest ostatio zawieszone zadanie.
Przykład wznowienia zadania o numerze JID 2:
$ bg %2

fg

uruchamia zatrzymane zadanie na pierwszym planie
Postać: fg [JID]
Przykład:
$ fg %2
spowodowałoby przeniesienie programu vim z poprzedniego przykładu na pierwszy plan

nice

uruchamia program z zadanym priorytetem
Postać: nice -priorytet [opcje] polecenie
Przykład:
$ nice +19 emacs
uruchomi program emacs z parametrem NICE równym 19. Im większa wartość NICE tym mniej zasobów będzie pochłaniało wykonanie procesu, czas jego trwania ulegnie wydłużeniu dając pierwszeństwo procesom z mniejszym priorytetem.

renice

pozwala zwiększyć priorytet działającego procesu
Postać: renice priorytet [PID] [-u użytkownik]
Opcja -u pozwala zmienić priorytet procesom uruchomionym przez danego użytkownika.
Przykład:
$ renice 19 4343 -u student
zwiększy priorytet do 19 procesu o numerze PID 4343 oraz wszystkim procesom uruchomionym przez użytkownika student .

at

uruchamia proces o zadanym czasie
Postać: at [-f plik] CZAS
Polecenie lub lista poleceń do uruchomienia wczytywana jest ze standardowego wejścia, lub po opcji -f możemy podać nazwę pliku w który zawarta jest lista poleceń do uruchomienia. CZAS może być wyrażony w wielu formach (po szczegóły zajrzyj do podręcznika man at). Wynik działania polecenia wysyłany jest do skrzynki pocztowej użytkownika. Przykład:
$ at 10:21 -f plik
spowoduje uruchomienie poleceń zawartych w pliku plik o godzinie 10.21
$ echo ls | at now +1minutes
spowoduje uruchomienie polecenia ls dokładnie za minutę

atq

wyświetla listę zadań ustawionych do wykonania za pomocą polecenia at
Postać: atq

atm

usuwa z kolejki zadanie o podanym numerze
Postać: atm numer_zadania

crontab

program zarządzający tabelami demona cron, który służy do wykonywania zaplanowanych w czasie operacji
Postać: crontab [-e|-l|-r]
Opcje:
-e edycja tabeli zadań
-r usunięcie bieżącej tabeli zadań
-l wyświetla bieżącą tabele zadań
Tabela zadań powinna zawierać w każdej linii wpis następującej postaci:
MINUTY GODZINY DNI MIESIACE DNI_TYGODNIA polecenie
gdzie MINUTY to liczba z zakresu 0-59, GODZINY - liczba z zakresu 0-23, DNI - liczba z zakresu 1-31, MIESIACE od 1 do 12, DNI_TYGODNIA od 1 do 7. Użycie gwiazdki * zamiast liczy oznacza dowolną wartość.
Przykładowa tabela zadań:

30   18   *   *       *      rm -f ~/tmp
30   0    1   1,6,12  *   mail student@fizyka.umk.pl < wiadomosc.txt

Powyższy zapis oznacza, że codziennie o godzinie 18:30 wykonywana jest komenda usuwająca katalog /tmp, zaś 30 minut po północy w pierwszy dzień stycznia, czerwca i grudnia wysyłany jest za pomocą poczty elektronicznej plik wiadomosc.txt do podanego użytkownika. Więcej szczegółów w podręczniku demona cron i polecenia crontab.

nohup

uruchamia polecenie, które nie zostanie przerwane w momencie wylogowania
Postać: nohup polecenie
Przykład:
$ nohup sleep 1000 &

fuser

identyfikuje procesy używające plików lub gniazd sieciowych
Postać: fuser [opcje] plik...
Polecenie fuser wyświetla listę numerów procesów PID, które wykorzystują w danym momencie wskazany plik, system plików lub gniazdo sieciowe.
Najważniejsze opcje:
-k zabij procesy zamiast wypisywać ich numery PID
-u podaj nazwę właściciela procesu wraz z numerem PID
-v wyświetl więcej szczegółów na temat procesów
Przykład:
$ fuser /home
wypisze numery procesów używających plików w katalogu /home

Inne przydatne polecenia: fuser, iotop, atd, pidof, lsof

2.7.2 Katalog /proc

W systemach UNIXopodobnych występuje katalog /proc zawierający informacje o procesach. Każdy proces jest tu reprezentowany w postaci katalogu o nazwie odpowiadającej numerowi PID. Wewnątrz każdego z nich można znaleźć pliki opisujące status danego procesu, np.: cmdline zawiera pełną linie uruchomionego polecenia, stat zawiera informacje o stanie procesu (z tego pliku korzysta ps), status - informacje o stanie procesu w bardziej przystępnej formie, itp.
Przykład:
$ cat /proc/1231/status
wyświetli inf. o stanie procesu 1231.

2.7.3 Ćwiczenia

  1. 1.

    Polecenie xclock -update 1 uruchamia w środowisku graficznym zegar z sekundnikiem. Uruchom zegar na pierwszym planie, zawieś jego działanie za pomocą Crtl+Z i wznów działanie w tle.

  2. 2.

    Wyślij sygnał SIGSTOP do procesu wyświetlającego zegar.

  3. 3.

    Uruchom w tle polecenie xclock -update 1

  4. 4.

    Wyślij sygnał SIGCont do wstrzymanego procesu wyświetlającego zegar.

  5. 5.

    Wyświetl wszystkie uruchomione przez siebie procesy.

  6. 6.

    Zabij procesy związane z wyświetlaniem zegarów.