background image

 

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  

 

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ę 

background image

 

( 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 %

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 %

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 %

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 %

 

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 %

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