Procesy w systemie UNIX

Autorem oryginalnej instrukcji do ćwiczenia jest Tomasz Toczyski.
Jej oryginał znajduje się pod adresem:
http://www.isep.pw.edu.pl/~toczyskt/procunix.html


Wstęp

Celem niniejszego ćwiczenia jest zaprezentowanie podstawowych zagadnień związanych z procesami w systemie Unix. Aby móc obserwować zmiany w ilości uruchomionych zadań dla jednego użytkownika, należy uruchomić program putty dwukrotnie (zalogować się dwa razy na tego samego użytkownika).

Unix jest systemem wielozadaniowym, co oznacza, że wiele procesów wykonuje się pozornie jednocześnie. Pozorność ta polega na tym, że jądro systemu udostępnia kolejno poszczególnym procesom czas procesora na krótkie (milisekundowe) okresy i tak naprawdę w danej chwili wykonuje się tylko jeden proces.

Każdy proces ma swój unikalny w zakresie całego systemu numer identyfikacyjny zwany PID (ang. process identification number). Oprócz numeru PID, każdy proces (z jednym wyjątkiem) ma numer PID swojego rodzica - tzw. PPID (ang. parent PID), czyli numer PID procesu, przez który został uruchomiony. Jedynym procesem, który nie ma swojego rodzica, jest proces o nazwie init, który jest jako pierwszy uruchamiany po starcie systemu operacyjnego. Proces init jest przodkiem wszystkich innych procesów.



Wyświetlanie informacji o procesach

Do wyświetlania informacji o procesach działających aktualnie w systemie służy polecenie ps. Polecenie ps ma wiele opcji. Pełen opis tego polecenia można uzyskać wpisując polecenie man ps. Aby wyświetlić pełną listę wszystkich działających w systemie procesów wykonaj w okienku terminala polecenie:
ps -ef
Prawdopodobnie lista ta będzie dłuższa niż liczba linii terminala. Aby wyświetlić tę listę z podziałem na strony, wpisz polecenie:
ps -ef | more
Wynik będzie miał postać:
       UID   PID  PPID  C    STIME TTY      TIME CMD
      root     0     0  0   Mar 14 ?        0:01 sched
      root     1     0  0   Mar 14 ?        0:01 /etc/init -
      root     2     0  0   Mar 14 ?        0:00 pageout
      root     3     0  0   Mar 14 ?        4:37 fsflush
      root   398     1  0   Mar 14 ?        0:00 /usr/lib/saf/sac -t 300
      root   401   398  0   Mar 14 ?        0:00 /usr/lib/saf/ttymon
      root 18333     1  0   Mar 15 ?        0:02 /usr/lib/inet/xntpd
      root    52     1  0   Mar 14 ?        0:00 /usr/lib/sysevent/syseventd
      root   249     1  0   Mar 14 ?        0:01 /usr/sbin/rpcbind
      root   252     1  0   Mar 14 ?        0:04 /usr/sbin/keyserv
      root   254     1  0   Mar 14 ?        0:13 /usr/sbin/nis_cachemgr
      root   308     1  0   Mar 14 ?        0:01 /usr/sbin/syslogd
      root   292     1  0   Mar 14 ?        1:10 /usr/lib/autofs/automountd
      root   330     1  0   Mar 14 ?        0:00 /usr/lib/utmpd
    adziel  1325  1317  0 08:30:32 pts/2    0:00 pine
      root   287     1  0   Mar 14 ?        0:00 /usr/lib/nfs/lockd
      root   288     1  0   Mar 14 ?        0:00 /usr/sbin/inetd -s -t
    daemon   289     1  0   Mar 14 ?        0:00 /usr/lib/nfs/statd
      root   348     1  0   Mar 14 ?        0:00 /usr/sbin/mdmonitord
      root   312     1  0   Mar 14 ?        0:00 /usr/sbin/cron
      root   329     1  0   Mar 14 ?        0:08 /usr/sbin/nscd -S passwd,yes
      root   360     1  0   Mar 14 ?        0:00 /usr/sbin/vold
  zielinr1  7344     1  0   Mar 15 ?        0:00 ./psybnc
Znaczenie poszczególnych kolumn jest następujące: Zauważ, że właścicielem wielu procesów w systemie jest użytkownik o nazwie root. Znaczy to, że procesy te są procesami systemowymi, bądź zostały uruchomione przez administratora systemu. Wśród wszystkich procesów działających w systemie, znajdź procesy, których jesteś właścicielem. Znajdź również procesy, które należą do innych użytkowników (np. kolegów z grupy).
Aby wyświetlić wszystkie procesy tylko jednego użytkownika, wpisz polecenie:
ps -fu nazwa_użytkownika


Zadania (ang. jobs)

Obok pojęcia procesu, kolejnym ważnym pojęciem w systemie unix jest zadanie (ang. job). Zadanie jest to proces, który został uruchomiony przez wywołanie komendy z danego terminala. Przykładowo, żeby uruchomić program vi z terminala należy wpisać:
vi
Spowodowało to utworzenie nowego zadania związanego z danym terminalem. W oknie terminala wyświetlany jest obraz edytora. Działanie terminala, z którego zostało wywołane polecenie zostało jakby wstrzymane do czasu zakończenia zadania vi.
Można jednak przywrócić działanie terminala poprzez zawieszenie (zatrzymanie) działania edytora. Aby tego dokonać, w aktywnym okienku terminala wciśnij kombinację klawiszy CTRL-Z. W okienku terminala ukaże się wtedy komunikat:
zsh: suspended  vi
Powyższy komunikat oznacza, że zadanie vi zostało zawieszone. Od tej chwili można już używać terminala. Zadanie vi działa jednak dalej w tle. Aby sprawdzić, jakie są uruchomione zadania dla danego terminala, wpisz polecenie:
jobs
Powinien wyświetlić się następujący komunikat:
[1]  + suspended  vi
Z poziomu terminala można uruchamiać zadania działające w tle, tzn. takie, których działanie nie powoduje zawieszenia działania terminala.
Do uruchamiania zadań w tle służy symbol "&" umieszczany na końcu polecenia. Aby uruchomić w tle program mail (prosty program do obsługi poczty), wpisz polecenie
mail &
Uruchomi się program, i od razu zostanie wstrzymany.
Po wydaniu polecenia jobs pojawi się:
[1]  - suspended  vi
[2]  + suspended  mail
Przedstawiona lista zawiera zadania uruchomione z danego terminala. W pierwszej kolumnie (w nawiasach) podany jest numer zadania. Dalej pojawiają się znaki '+' (plus), '-' (minus) lub nie ma znaku (czyli spacja). Oznaczają one kolejność wstrzymywanych zadań. Ostatnio wstrzymane oznaczane jest +, poprzednie -, a dalsza kolejność nie jest określana (brak znaku). Kolejna kolumna mówi o stanie danego zadania: "suspended" - oznacza wstrzymane. Ostatnia kolumna mówi jakim poleceniem zostało uruchomione zadanie. Tak jak już wcześniej napisano, zadanie jest to szczególny rodzaj procesu. Używając komend
ps -ef | more
lub
ps -fu nazwa_użytkownika
wyszukaj procesy vi i mail. Zauważ, że są one związane z tym samym terminalem (kolumna TTY). Aby uaktywnić zadanie zawieszone w tle, korzystamy z polecenia fg (od angielskiego słowa foreground - tło), po którym podajemy numer zadania poprzedzony znakiem "%". Przykładowo, aby wznowić działanie programu vi, wpisz:
fg %1
Teraz można ponownie używać edytora.

Polecenie kill

Do zmiany stanu zadania lub procesu służy polecenie kill. Ma ono wiele wariantów. Tutaj zajmiemy się jedynie dwoma z nich. Aby zatrzymać (zawiesić) zadanie używamy polecenia kill -STOP numer_PID

Przykład:
W jednym oknie terminala są dwa zadania:
vi - uruchomiony
mail - wstrzymany
Aby zatrzymać zadanie nr 1 (czyli program vi), należy najpierw odczytać jego numer procesu. Polecenie (wydane w drugim oknie terminala):
ps -fu nazwa_użytkownika
pozwoli odczytać (przykładowo):
   UID   PID  PPID  C    STIME TTY      TIME CMD
ksiezyk  3129  2806  0 12:07:45 pts/6    0:00 vi
ksiezyk  2806  2804  0 11:46:36 pts/6    0:00 -zsh
ksiezyk  7093  2806  0 14:52:44 pts/6    0:00 mail
ksiezyk  7124  7010  0 14:53:11 pts/1    0:00 ps -fu ksiezyk
ksiezyk  2823  2821  0 11:47:20 ?        0:00 /usr/lib/ssh/sftp-server
ksiezyk  7010  7008  0 14:50:14 pts/1    0:00 -zsh
Proces który chcemy zatrzymać ma numer PID = 3129

Polecenie:
kill -STOP 3129 
spowoduje wstrzymanie tego zadania. Stan zadania "suspended (signal)" oznacza, że zadanie zostało zawieszone przy użyciu polecenia kill. Aby zabić dane zadanie (czyli spowodować bezwarunkowe zakończenie jego wykonywania) należy użyć polecenia:
kill -9 numer_zadania z numerem zadania poprzedzonym znakiem %. W celu zabicia zadania nr 2 (czyli programu mail) wpisz polecenie
kill -9 %2
Spowoduje to zakończenie działania programu mail i wypisanie komunikatu:
[1] +  killed  mail
Aby się przekonać, że zadanie mail zostało zakończone, możesz obejrzeć aktualną listę zadań, wpisując polecenie: jobs.
Możesz również używając polecenia ps -ef | more lub ps -fu nazwa_użytkownika przekonać się, że proces mail przestał istnieć w systemie. W ramach samodzielnych eksperymentów, stwórz nowe zadania i przetestuj na nich działanie poleceń kill -STOP oraz kill -9 użytych z numerem PID procesów. W systemach unixowych, zwykły użytkownik (nie będący administratorem) może manipulować jedynie procesami, które do niego należą. Aby się o tym przekonać, w ramach samodzielnych eksperymentów, spróbój zabić jakiś dowolny proces, którego nie jesteś właścicielem.

Procesy potomne

Tak jak już na początku niniejszej instrukcji napisano, każdy proces ma, oprócz własnegu numeru PID, numer PPID - tj. numer PID procesu rodzica, czyli procesu przez który został wywołany. W systemach unixowych zakończenie działania danego procesu powoduje zakończenie działania wszystkich jego procesów potomnych. Przykład:

W drugim oknie terminala są uruchomione trzy zadania np:
[1]    suspended (tty output)  vi
[2]  - suspended (tty input)  mail
[3]  + suspended (tty output)  vim
Używając polecenia ps -fu nazwa_użytkownika wydanego w pierwszym oknie terminala odszukamy procesy związane z tymi zadaniami. Porównując numery PID i PPID procesów, zauważ, że rodzicem twojego procesu vi jest pewien proces o nazwie zsh - jest to interpreter poleceń. Przekonaj się teraz, co się stanie z procesem vi gdy proces zsh zostanie zabity.
W tym celu, zabij proces zsh poleceniem kill -9 numer_PID
wydanym z terminala pierwszego.
Zamin to wykonasz sprawdź poleceniem tty z którą konsolą masz do czynienia.
Po zakończeniu procesu zsh, z którymi były związane zadania (i procesy) vi, mail i vim można sprawdzić, że te procesy zostały zakończone. Uwaga: W praktyce, zakańczanie działania programów za pomocą polecenia kill -9 stosuje się jedynie w sytuacja awaryjnych, gdy nie ma możliwości zakończenia programu w sposób dla niego naturalny (np. poprzez wybranie w programie opcji "Koniec pracy"). Użycie polecenia kill -9 powoduje natychmiastowe zakończenie działania procesu. Proces ten nie ma wtedy możliwości zapisania obrabianych danych i czasami dane te mogą zostać bezpowrotnie utracone.

Co jeszcze oferuje nam Unix ...

Niniejsze ćwiczenie miało na celu zaprezentowanie jedynie podstawowych zagadnień związanych z procesami w systemie Unix. System ten oferuje użytkownikom znacznie większe możliwości zarządania procesami, np: Osoby, zainteresowane powyższymi zagadnieniami, zachęcam do zgłębiania tajników systemów unixowych.

Valid XHTML 1.0 Transitional Valid CSS!