E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\34.DOC 563
Rozdzia³ 34. ¨ Procesy 563
Tim Parker
W tym rozdziale:
u Co trzeba wiedzieć o procesach
u Polecenie ps
u 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.
myślę, że można to przełożyć nieco lepiej.
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
W systemie Linux rozróżniane są trzy rodzaje procesów, posiadające nieco inne cechy i atrybuty. Są to:
u procesy interaktywne – uruchamiane poprzez powłokę i przez nią kontrolowane; procesy takie mogą działać w tle lub na pierwszym planie;
u procesy wsadowe (ang. batch process), nie powiązane z żadnym terminalem, ale wstawiane do kolejki i wykonywane sekwencyjnie;
u procesy rezydentne – czyli demony (ang. daemons); są one zwykle uruchamiane podczas startu systemu i pracują w tle przez cały czas działania Linuxa.
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 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).
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:
$ psPID 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.
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 | moreps > /tmp/ps_out
Po dołączeniu do polecenia ps opcji u uzyskujemy kilka nowych informacji. Oto wynik wykonania takiego polecenia przez zwykłego użytkownika:
$ ps uUSER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMANDbill 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 aPID TTY STAT TIME COMMAND228 1 S 0:00 /bin/login -- root230 3 S 0:00 /sbin/mingetty tty3231 4 S 0:00 /sbin/mingetty tty4232 5 S 0:00 /sbin/mingetty tty5233 6 S 0:00 /sbin/mingetty tty6236 1 S 0:00 -bash248 1 S 0:12 /usr/bin/mc -P250 p0 S 0:00 bash –rcfile .bashrc281 2 S ...
osyrius