34 (12)


Rozdział 34.
Procesy

Tim Parker
W tym rozdziale:
* Co trzeba wiedzieć o procesach
* Polecenie ps
* Polecenie kill
Każdy program działający w systemie linuxowym
uruchomiony przez użytkownika,
przez systemu, czy też program rezydentny
jest procesem. Umiejętność
zarzÄ…dzania procesami jest dla administratora bardzo istotna (czasem nawet
nieodzowna). W tym rozdziale przyjrzymy się bliżej temu problemowi. Nie
będziemy oczywiście omawiać szczegółów technicznych przydzielania poszczególnym
procesom czasu procesora czy pamięci operacyjnej. Omówimy jednak najważniejsze

z punktu widzenia administratora
zagadnienia, których znajomość jest
niezbędna do zapewnienia bezawaryjnej pracy systemu.
Przy opisie systemów wielozadaniowych często używa się pojęć proces i zadanie.
Często mogą być one używane zamiennie, ale przez zadanie przeważnie rozumie się
proces uruchomiony przez interpreter poleceń (który może również zatrudniać
inne procesy). Proces jest najmniejszą niepodzielną częścią programu,
działającą w systemie Linux.
Co trzeba wiedzieć o procesach
Formalna definicja procesu brzmi: proces to program, który posiada własną
wirtualną przestrzeń adresową. Oznacza to, że każdy program działający w
systemie linuxowym jest procesem. Pojedyncze polecenie może uruchamiać wiele
różnych procesów, szczególnie jeśli użyty zostanie mechanizm przekierowania czy
potoków (ang. pipe). Poniższe polecenie powoduje uruchomienie trzech procesów,
po jednym dla każdego wywoływanego programu:

nroff
man ps.1 | grep kill | more
Typy procesów
W systemie Linux rozróżniane są trzy rodzaje procesów, posiadające nieco inne
cechy i atrybuty. SÄ… to:
* procesy interaktywne
uruchamiane poprzez powłokę i przez nią kontrolowane;
procesy takie mogą działać w tle lub na pierwszym planie;
* procesy wsadowe (ang. batch process), nie powiązane z żadnym terminalem, ale
wstawiane do kolejki i wykonywane sekwencyjnie;
* procesy rezydentne
czyli demony (ang. daemons); sÄ… one zwykle uruchamiane
podczas startu systemu i pracują w tle przez cały czas działania Linuxa.
Użycie polecenia ps
Najprostszym sposobem na sprawdzenie, jakie procesy działają aktualnie w
systemie, jest użycie polecenia ps (ang. process status). Udostępnia ono sporo
różnego typu opcji, ale tylko kilka z nich wykorzystuje się w praktyce.
Rozpoczniemy od przedstawienia najbardziej podstawowych informacji o tym
poleceniu, a następnie omówimy niektóre z jego opcji.
Polecenie ps jest dostępne dla wszystkich użytkowników systemu, ale dla
użytkownika root wyniki jego działania mogą być nieco inne niż dla zwykłego
użytkownika.
Jeśli jesteś zalogowany jako zwyczajny użytkownik (tj. nie jako root) i wydasz
polecenie ps, wyświetlone zostaną informacje o wszystkich procesach, których
jesteś właścicielem. Możesz na przykład zobaczyć następujące dane:

$ ps
PID TTY STAT TIME COMMAND
229 2 S 0:00 /bin/login -- reksio
257 2 S 0:00 -bash
269 2 R 0:00 ps
Dane wyświetlane przez program ps
Dane wyświetlane przez program ps zawsze podawane są w kolumnach. Pierwsza
kolumna ma nagłówek PID (ang. Process ID) i zawiera identyfikator procesu.
Każdemu procesowi działającemu w systemie przypisany jest niepowtarzalny numer,
dzięki któremu Linux może odróżnić go od innych procesów. Numerowanie procesów
rozpoczyna siÄ™ od zera po uruchomieniu Linuxa, a maksymalna dopuszczalna
wartość zależy od systemu (często jest to 65535). Po przekroczeniu wartości
maksymalnej numerowanie znów zaczyna się od zera, z pominięciem tych numerów,
które zostały przydzielone wciąż aktywnym procesom. Zwykle najniższe numery
przydzielone są procesom wchodzącym w skład jądra systemu i programom
rezydentnym (demonom), uruchamianym podczas startu systemu. Jeśli chcesz zrobić
cokolwiek z procesem (na przykład zakończyć jego działanie), musisz znać jego
identyfikator.
Kolumna opisana jako TTY zawiera informację o tym, z której konsoli dany proces
został uruchomiony. Jeśli jesteś zalogowany jako zwykły użytkownik, będzie to
nazwa Twojego terminalu lub konsoli. Jeżeli jesteś zalogowany na kilku
konsolach, zobaczysz dane o procesach uruchomionych na wszystkich konsolach.
W kolumnie STAT znajduje się informacja o bieżącym stanie procesu. Najczęściej
pojawiajÄ… siÄ™ tu litery S (ang. sleeping
proces uśpiony) i R (ang. running

aktywny). Stan procesu może zmieniać się z uśpionego na aktywny i odwrotnie
wiele razy w ciÄ…gu sekundy.
Kolumna TIME zawiera całkowitą ilość czasu procesora użytego przez proces do
tej pory. Zwykle jest to wartość bardzo mała (większość procesów wykonuje się
dość szybko). Jest to czas, przez jaki proces miał dostęp do procesora, a nie
czas, który upłynął od momentu jego uruchomienia.
Ostatnia kolumna
COMMAND
zawiera polecenie, za pomocą którego proces został
uruchomiony. Przeważnie jest to polecenie wpisane przez użytkownika z
klawiatury terminalu, jednak ps na równych prawach traktuje też procesy
wywołane przez inne procesy (nazywane procesami potomnymi
ang. child
processes).
Interpretery poleceń uruchamiane przy logowaniu
Aby pomóc Ci odróżnić interpreter, który został uruchomiony podczas logowania,
od pozostałych (uruchomionych później), jego nazwa poprzedzona jest myślnikiem,
na przykład tak:

$ ps
PID TTY STAT TIME COMMAND
46 v01 S 0:01 -bash
75 v01 S 0:00 pdksh
96 v01 R 0:00 bash
123 v01 R 0:00 ps
W powyższym przykładzie widać, że interpreter poleceń o identyfikatorze 46
uruchomiony został przy logowaniu, natomiast inne interpretery (o
identyfikatorach 75 i 96) zostały uruchomione później.
Zauważ, że na liście procesów zawsze znajduje się polecenie ps; jest to
oczywiste, jeśli wziąć pod uwagę fakt, że polecenie to było uruchomione w
trakcie swojego działania.
Uwagi dla użytkownika root
Kiedy zwykły użytkownik wydaje polecenie ps, uzyskuje listę własnych procesów.
Jeśli jesteś zalogowany jako root, zobaczysz w takiej sytuacji listę wszystkich
procesów w systemie, ponieważ root jest właścicielem ich wszystkich. Lista taka
może być bardzo długa, szczególnie w systemach, w których pracuje jednocześnie
kilku użytkowników. Powinieneś więc skierować ją do pliku albo na wejście
polecenia more lub less, na przykład za pomocą jednego z poleceń:

ps | more
ps > /tmp/ps_out
Przydatne opcje programu ps
Po dołączeniu do polecenia ps opcji u uzyskujemy kilka nowych informacji. Oto
wynik wykonania takiego polecenia przez zwykłego użytkownika:

$ ps u
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
bill 281 0.2 3.0 1492 948 2 S 18:25 0:00 /bin/login -- åbill
bill 284 0.2 2.4 1180 768 2 S 18:26 0:00 -bash
bill 298 0.0 1.5 856 488 2 R 18:26 0:00 ps u
Najważniejsza nowość to kolumna USER, która pokazuje, kto uruchomił i posiada
dany proces. Zamiast numerycznego identyfikatora użytkownika wyświetlany jest
odpowiadajÄ…cy mu identyfikator tekstowy, odszukany przez polecenie ps w pliku
/etc/passwd.
Opcja u powoduje również wyświetlenie kolumn zawierających dane o procentowym
zużyciu czasu procesora (kolumna %CPU) i pamięci (kolumna %MEM). Dane te mogą
być użyteczne w przypadku, gdy z nieznanych bliżej powodów system zwolni
działanie. Można wówczas odszukać "winowajcę" (w języku angielskim procesy
konsumujące nadmierne ilości zasobów zwane są "memory hogs" i "CPU hogs") i
sprawdzić, czy przypadkiem nie jest to proces, który wymknął się spod kontroli
i pochłania zasoby systemowe.
Kiedy wydasz polecenie ps u, będąc zalogowany jako root, zobaczysz listę
wszystkich procesów działających w systemie. Podobnie jak poprzednio, może
zajść konieczność przesłania wyników polecenia do pliku lub na wejście programu
more. W niektórych wersjach Linuxa po opcji u można również podać identyfikator
użytkownika, co spowoduje wyświetlenie tylko procesów do niego należących, na
przykład:

ps u bill
Ta składnia polecenia ps jest dozwolona w wersjach dostarczanych wraz z System
V, ale nie działa w większości rozprowadzanych z Linuxem wersji programu ps
opartych o BSD (w tym w wersji dostępnej na załączonym do książki dysku CD).
Inne wersje tego polecenia dostępne są w węzłach FTP i BBS. Większość
użytkowników może również użyć opcji u aby zobaczyć listę procesów
uruchomionych przez innych użytkowników. Dzięki temu można sprawdzić, kto
uruchamia procesy pochłaniające najwięcej zasobów, a administrator może łatwo
zorientować się, jakie procesy uruchamiał użytkownik zgłaszający problemy z
systemem.
Zwykły użytkownik może również zobaczyć listę wszystkich procesów działających
w systemie (a nie tylko procesów uruchomionych przez siebie), używając opcji a
(jeśli zastosujesz tę opcję, gdy jesteś zalogowany jako root, wyświetlana lista
oczywiście nie zmieni się). Oto przykładowy wynik działania polecenia ps a
wydanego przez zwykłego użytkownika:

$ ps a
PID TTY STAT TIME COMMAND
228 1 S 0:00 /bin/login -- root
230 3 S 0:00 /sbin/mingetty tty3
231 4 S 0:00 /sbin/mingetty tty4
232 5 S 0:00 /sbin/mingetty tty5
233 6 S 0:00 /sbin/mingetty tty6
236 1 S 0:00 -bash
248 1 S 0:12 /usr/bin/mc -P
250 p0 S 0:00 bash
rcfile .bashrc
281 2 S 0:00 /bin/login -- bill
284 2 S 0:00 -bash
300 2 R 0:00 ps a
Tak krótki wydruk pochodzi z systemu, w którym w zasadzie nic się nie dzieje.
Większość pozycji opisuje procesy systemowe. W powyższym przypadku nie można
określić, kto uruchomił dany proces
ale można połączyć opcje a oraz u:

$ ps au
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
bill 281 0.1 3.0 1492 948 2 S 18:25 0:00 /bin/login -- åbill
bill 284 0.1 2.4 1180 768 2 S 18:26 0:00 -bash
bill 302 0.0 1.5 856 492 2 R 18:27 0:00 ps au
root 228 0.0 3.0 1496 952 1 S 18:18 0:00 /bin/login -- åroot
root 230 0.0 1.0 740 316 3 S 18:18 0:00 /sbin/mingetty åtty3
root 231 0.0 1.0 740 316 4 S 18:18 0:00 /sbin/mingetty åtty4
root 232 0.0 1.0 740 316 5 S 18:18 0:00 /sbin/mingetty åtty5
root 233 0.0 1.0 740 316 6 S 18:18 0:00 /sbin/mingetty åtty6
root 236 0.0 2.5 1184 772 1 S 18:19 0:00 -bash
root 248 2.5 4.4 2456 1372 1 S 18:19 0:12 /usr/bin/mc -P
root 250 0.0 2.5 1188 772 p0 S 18:19 0:00 bash
rcfile å.bashrc
Wyświetlane są kolumny zawierające te same informacje, jak w przypadku użycia
opcji u, ale dotyczące wszystkich działających procesów. Porządek, w jakim
podane zostanÄ… opcje, nie jest istotny.
Opcja l pozwala na uzyskanie informacji o tym, przez jaki proces dany proces
został uruchomiony:

$ ps l
FLAGS UID PID PPID PRI NI SIZE RSS WCHAN STA TTY TIME COMMAND
100100 501 281 1 0 0 1492 948 wait4 S 2 0:00
å /bin/login -- bill
501 284 281 9 0 1180 768 wait4 S 2 0:00 -bash
100000 501 304 284 10 0 968 504 R 2 0:00 ps -l
Kolumna PPID (ang. Parent Process ID) zawiera identyfikator procesu, który
uruchomił dany proces. Jak widać, program ps uruchomiony został przez powłokę
bash, która z kolei została uruchomiona przez proces o numerze 1
czyli proces
init, który jest "matką" wszystkich innych procesów (jeśli zastanawiasz się,
jakie ma to konsekwencje
odpowiedź jest prosta: jeśli ten proces zakończy
działanie, przestaną działać wszystkie inne procesy).


Wydając polecenie ps można, ale nie trzeba używać myślnika przed nazwami opcji.
Uwagi dla administratorów
W większości przypadków trzy przedstawione wcześniej wersje polecenia ps
dostarczają wszystkich potrzebnych informacji. Jeśli potrzebne są dane o
systemie jako całości, wystarczy wydać polecenia:

ps
ax
ps
aux
ps
le
Na ekranie otrzymasz wszystkie chyba dostępne w systemie informacje o
procesach. Dokładniejsze dane o działaniu polecenia ps możesz znaleźć na
stronach man (które w tym przypadku nie są
niestety
kompletne).
Polecenie kill
Od czasu do czasu zdarza się proces, który zawiesi terminal albo po prostu nic
nie robi. Zwykle sytuacja taka jest wynikiem błędów tkwiących w różnych
programach. W obu przypadkach jedyną drogą usunięcia takiego procesu jest
wydanie polecenia kill.


Kiedy kończysz działanie procesu, a jesteś zalogowany jako root, zwróć
szczególną uwagę na numer procesu, który zamierzasz usunąć, żeby przypadkiem
nie popełnić mogącej mieć przykre skutki pomyłki. Nie powinieneś usuwać
procesów systemowych, chyba że dokładnie wiesz, co chcesz przez to osiągnąć.
Aby użyć polecenia kill, musisz mieć dostęp do okna lub konsoli, w którym
będziesz mógł wydawać polecenia. Jeśli terminal zawiesił się kompletnie

musisz znaleźć inny. Jako zwykły użytkownik możesz usuwać tylko własne procesy.
Jako użytkownik root możesz manipulować wszystkimi procesami.
Musisz również znać identyfikator procesu, który chcesz usunąć (polecenie kill
służy również do wysyłania innych sygnałów do procesów, nie tylko do ich
usuwania
przyp. tłum.). Jest on wyświetlany przez polecenie ps. Poniżej
podano przykład, w którym proces o nazwie bad_prog i identyfikatorze 292 nie
zakończył się prawidłowo, w związku z czym trzeba go usunąć.

$ ps u
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
walter 281 0.2 3.0 1245 467 2 S 13:25 0:00 -bash
walter 292 9.2 12.0 2134 467 2 R 15:51 2:01 bad_prog
å$ kill 292
Polecenie kill nie wyświetla informacji potwierdzającej usunięcie procesu. Aby
sprawdzić, czy wszystko przebiegło poprawnie, trzeba ponownie wydać polecenie
ps.
Usuwanie procesów potomnych
Jeśli proces, który chcesz usunąć, podczas swojego działania uruchomił inne
procesy, powinieneś usunąć również wszystkie procesy potomne. Czasem zdarza
się, że usunięty proces "odradza" się po chwili
w takim przypadku usunąć
należy proces, który go wywołuje (jego identyfikator można znaleźć w kolumnie
PPID po wydaniu polecenia ps l).
Jeśli pomimo wydania polecenia kill proces nadal działa, trzeba użyć
mocniejszych argumentów. Polecenie kill udostępnia kilka poziomów działania.
Wydane tylko z jednym argumentem
numerem procesu
próbuje grzecznie
zakończyć proces, tzn. zamknąć otwarte pliki, zwolnić pamięć itd. Jeśli to nie
pomaga, należy użyć opcji
9, która wymusza zakończenie procesu, na przykład
tak:

kill
9 726
Jeśli nie działa nawet polecenie kill -9, możliwe, że masz do czynienia z
jednym z "nieśmiertelnych" procesów. Jedynym sposobem na zakończenie działania
takiego stworzenia jest ponowne uruchomienie systemu.
Co można, a czego nie można usunąć
Generalnie nie możesz usunąć procesu nie należącego do Ciebie. Przy próbie
zrobienia czegoÅ› takiego otrzymasz komunikat:

kill: - Not owner
Oczywiście użytkownik root może usunąć każdy proces.
Podsumowanie
W tym rozdziale pokazaliśmy, w jaki sposób można uzyskać informacje o procesach
działających w systemie oraz jak (w razie potrzeby) można je usunąć.
Prawdopodobnie informacji tych nie będziesz musiał wykorzystywać szczególnie
często (chyba, że jesteś programistą-eksperymentatorem), ale w każdym systemie
od czasu do czasu zdarzają się sytuacje awaryjne. Problemy mają zwyczaj mnożyć
się przy wzroście liczby użytkowników, a wtedy restart systemu jest rzeczą dość
uciążliwą. Polecenie ps pozwala przeważnie na uniknięcie konieczności
resetowania komputera.
Konfigurowanie i dodawanie do systemu urządzeń SCSI omówione jest w rozdziale
36. "Obsługa urządzeń SCSI".
Jak skonfigurować system, by można było korzystać z poczty elektronicznej,
dowiesz się z rozdziału 40. "Konfigurowanie poczty".
Polecenie tar i tworzenie kopii zapasowych przedstawione sÄ… w rozdziale 45.
"Kopie zapasowe".




Wyszukiwarka