1
Politechnika Krakowska im. T. Kościuszki
INSTYTUT INFORMATYKI STOSOWANEJ
Środowisko LINUX - Procesy w systemie Unix
Systemy
Operacyjne
LABORATORIUM
2 x 45min
1. Cel
Celem niniejszego ćwiczenia jest zaprezentowanie podstawowych zagadnień związanych z
procesami w systemie Unix.
2. Wstęp
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.
3. 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
Znaczenie poszczególnych kolumn jest następujące:
UID
- nazwa użytkownika (właściciela procesu)
PID
- numer identyfikacyjny procesu
PPID
- numer PID rodzica danego procesu
C
- miara obciążenia procesora
STIME
- czas rozpoczęcia działania procesu
TTY
- nazwa terminala związanego z procesem
TIME
- czas wykorzystania procesora
CMD
- komenda, która wywołała proces
2
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. Aby wyświetlić wszystkie procesy tylko jednego użytkownika, wpisz polecenie
ps -fu
nazwa_użytkownika
4. 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, aby uruchomić edytor tekstowy vi, wpisz w terminalu komendę:
vi
Spowodowało to utworzenie nowego zadania związanego z danym terminalem. Zostało
otworzone okienko edytora. Zauważ, że działanie terminala, z którego wywołano vi zostało
zawieszone do czasu zakończenia zadania vi.
Można jednak przywrócić działanie terminala poprzez uśpienie działania edytora. Aby tego
dokonać, w aktywnym okienku terminala wciśnij kombinację klawiszy CTRL-Z.
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 pico, wpisz polecenie
pico &
Otworzy się okienko programu pico. Zauważ, że teraz zarówno terminal jak i okienko
programu pico są aktywne, czyli terminal i program Midnight Commander działają
równolegle. Aby wyświetlić informacje o wszystkich związanych z danym terminalem
zadaniach, wpisz polecenie:
jobs
Pierwsza linijka oznacza, że zadanie vi ma numer 1, a druga linijka oznacza, że zadanie
pico
ma numer 2. „suspended” oznacza że oba procesy są uśpione, czyli nie wykonują
żadnych działań do momentu ich wywołania za pomocą komendy:
fg %numer_zadania
Komenda ta służy do przeniesienia procesu do tzw. „foreground”, czyli naszej konsoli wraz z
ekranem. Istnieje także pojęcie „background” i oznacza ono pracę programu w tle. Opcję
przeniesienia procesu do „background’u” realizujemy za pomocą komendy:
bg %
numer_zadania
Spróbujmy obudzić zadanie 2 i przenieść je na konsolę komendą:
fg %
2
Znaleźliśmy się w programie pico. Teraz opuszczamy go za pomocą kombinacji klawiszy
CTRL+X (^X), a następnie wykonujemy komendę
3
( date; sleep 60; date ) > data &
Komenda ta pozwoli nam obejrzeć proces przeniesiony w tło (background), ale aktywny –
wykonujący działanie. Komenda ma za zadanie wypisać datę do pliku data odliczyć do 60
sekund, po czym znowu wpisać datę. Jeśli wykonamy teraz polecenie:
cat
data
To okaże się, że znajduje się tam jedna linia z aktualną datą i godziną. Po upływie minuty
wykonanie tego polecenia da nam dwie linie. Wywołanie komendy jobs po drugim wpisie
pokaże nam tylko vi (druga komenda zakończyła swoje zadanie). Spróbujmy wykonać teraz
tę samą komendę co poprzednio, ale bez wysyłania go w tło:
( date; sleep 600; date; ) > data2
Po czym uśpijmy go za pomocą kombinacji klawiszy CTRL+Z (^Z). Wywołajmy listę
zadań za pomocą jobs, a następnie wpiszmy cat data2. Widzimy, że w odróżnieniu do
poprzedniego sposobu teraz nasz program jest uśpiony, a nie uruchomiony. Znajduje się
więc w tle jednak jego działanie zostało wstrzymane. Spróbujmy przywrócić go do stanu
running. Musimy przenieść te zadanie do backround’u:
bg %
2
Wywołanie teraz listy procesów pokaże nam wznowiony proces pozwalając mu wykonywać
zadania. Możemy także obejrzeć jego działanie poprzez przesunięcie go do foreground’u:
fg %
2
Proces przerywamy kombinacją klawiszy CTRL+C. Używając komend ps -ef | more
lub ps -fu
nazwaużytkownika
wyszukaj procesy vi i pico. Zauważ, że są one związane
z tym samym terminalem (kolumna TTY).
4. Polecenie kill
Do zmiany stanu zadania lub procesu służy polecenie kill. Ma ono wiele wariantów. Aby
zatrzymać (zawiesić) zadanie używamy polecenia kill -STOP z numerem zadania
poprzedzonym znakiem "%". Aby zatrzymać zadanie nr 2 (czyli program pico), wpisz
polecenie
kill -STOP %
2
Aby sprawdzić, w jakim stanie są zadania, wpisz polecenie
jobs
Stan "suspended (signal)" oznacza, że zadanie zostało zawieszone przy użyciu polecenia
kill
. Sprawdź, że program pico został zawieszony, co objawia się np. tym, że przestał
reagować na wciśnięcia przycisków. Aby zabić dane zadanie, (czyli spowodować
bezwarunkowe zakończenie jego wykonywania) należy użyć polecenia kill -9 z numerem
zadania poprzedzonym znakiem %. W celu zabicia zadania nr 1 (czyli programu vi) wpisz
kill -9 %
1
4
Aby się przekonać, że zadanie vi zostało zakończone, możesz obejrzeć aktualną listę
zadań, wpisując polecenie:
jobs
Identyczne efekty można uzyskać używając numeru PID procesu zamiast numeru zadania
poprzedzonego symbolem "%". Możesz również używając polecenia ps -ef | more lub
ps -fu
nazwaużytkownika
przekonać się, że proces vi 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żą.
5. Procesy potomne
Tak jak już na początku niniejszej instrukcji napisano, każdy proces ma, oprócz własnego
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.
bash
&
Powłoka bash jest innym typem terminala i można z niego korzystać w niemal identyczny
sposób jak z terminala, którego używaliśmy do tej pory. W tej chwili mamy otworzone na
pulpicie dwa terminale. Aby uniknąć nieporozumień, terminal, którego używaliśmy do tej pory
będziemy nazywać "standardowym". Aby uruchomić edytor vi jako proces potomny
względem terminala bash, wpisz w oknie terminala bash polecenie:
vi
Powinno się pojawić okienko edytora. Przejdź do terminala standardowego. Używając
poleceń ps -ef | more lub ps -fu
nazwaużytkownika
odszukaj procesy bash oraz vi.
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ń. Rodzicem tego procesu zsh jest
natomiast Twój proces bash. Oznacza to, że Twój proces vi jest potomkiem drugiego
pokolenia procesu bash. Przekonaj się teraz, co się stanie z procesem vi, gdy proces bash
zostanie zabity. W tym celu, aby się dowiedzieć, jaki jest numer zadania związanego z
terminalem bash, w terminalu standardowym wpisz polecenie
jobs
Oznacza to, że zadanie bash ma numer 1. Zabij więc to zadanie poleceniem
kill -9 %
1
Uwaga: W praktyce, zakańczanie działania programów za pomocą polecenia kill -9
stosuje się jedynie w sytuacja awaryjnych. Instalacja edytora nano:
ftp://ftp.cac.washington.edu/pine/pine-4.64-1.i386.rpm; # rpm –ivh --force
--nodeps pine-4.64-1.i386.rpm