Autorem oryginalnej instrukcji do ćwiczenia jest Tomasz Toczyski.
Jej oryginał znajduje się pod adresem:
http://www.isep.pw.edu.pl/~toczyskt/procunix.html
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.
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 -efPrawdopodobnie 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 | moreWynik 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 ./psybncZnaczenie poszczególnych kolumn jest następujące:
UID
- nazwa użytkownika (właściciela procesu)PID
- numer identyfikacyjny procesuPPID
- numer PID
rodzica danego procesuC
- miara obciążenia procesoraSTIME
- czas rozpoczęcia działania procesuTTY
- nazwa terminala związanego z procesemTIME
- czas wykorzystania procesoraCMD
- komenda, która wywołała procesroot
. 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).ps -fu nazwa_użytkownika
vi
z terminala należy wpisać:
viSpowodował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.
zsh: suspended viPowyż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:
jobsPowinien wyświetlić się następujący komunikat:
[1] + suspended viZ poziomu terminala można uruchamiać zadania działające w tle, tzn. takie, których działanie nie powoduje zawieszenia działania terminala.
&
" 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.
[1] - suspended vi [2] + suspended mailPrzedstawiona 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 | morelub
ps -fu nazwa_użytkownikawyszukaj 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 %1Teraz można ponownie używać edytora.
kill
kill
. Ma ono wiele wariantów.
Tutaj zajmiemy się jedynie dwoma z nich.
Aby zatrzymać (zawiesić) zadanie używamy polecenia kill -STOP numer_PID
ps -fu nazwa_użytkownikapozwoli 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 -zshProces który chcemy zatrzymać ma numer
PID = 3129
kill -STOP 3129spowoduje 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 %2Spowoduje to zakończenie działania programu
mail
i wypisanie komunikatu:
[1] + killed mailAby się przekonać, że zadanie
mail
zostało zakończone, możesz obejrzeć aktualną listę zadań,
wpisując polecenie: jobs.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.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:[1] suspended (tty output) vi [2] - suspended (tty input) mail [3] + suspended (tty output) vimUż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.zsh
poleceniem kill -9 numer_PID
tty
z którą konsolą masz do czynienia.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.nohup
) crontab
oraz at
)nice
).