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".