Tak więc wiesz już, jak przełączać uruchomione programy w tło i z powrotem przywracać je na pierwszy plan. Wiesz także, że cały czas w systemie uruchomionych jest wiele różnych procesów. Ale jak zdobyć ich listę? Służy do tego polecenie ps(1). Polecenie to posiada całą masę opcji; my skupimy się tylko na tych najważniejszych. By uzyskać pełną ich listę, przejrzyj strony manuala. O samym manualu powiedziano więcej w rozdziale Sekcja 2.1.1.
Proste wpisanie ps zaowocuje wypisaniem spisu wszystkich programów uruchomionych na twoim terminalu, włączając w to programy działające na pierwszym planie (w tym także powłokę, której używasz oraz, rzecz jasna, samo ps). Wylistowane zostaną także procesy, które uruchomiłeś w tle. Często może być to dość krótka lista:
Figure 11-1. Przykładowe wyjście dla ps
% ps PID TTY TIME CMD 7923 ttyp0 00:00:00 bash 8059 ttyp0 00:00:00 ps |
Pomijając niewielką liczbę procesów, informacja powyższa jest całkiem typowa. Zawsze uzyskasz te same kolumny, gdy użyjesz ps, niezależnie od tego jak wiele procesów jest uruchomionych. Więc teraz: co to wszystko znaczy?
Zaczynając od lewej: PID oznacza identyfikator procesu (ang. process ID). Każdy działający proces posiada swój własny, unikalny identyfikator którym jest liczba z przedziału pomiędzy 1 a 32767. Każdemu nowemu procesowi jest przydzielany pierwszy wolny PID. Kiedy proces kończy swoje działanie normalnie (albo też kiedy zostaje "zabity" - o tym przeczytasz w następnym podrozdziale), jego PID zostaje zwolniony. Kiedy maksymalny PID zostaje osiągnięty, następnemu procesowi przydzielony zostanie najniższy aktualnie wolny PID.
Kolumna TTY określa, w którym terminalu uruchomiony został proces. Wykonanie polecenia ps wypisze jedynie procesy uruchomione na aktualnym terminalu, tak więc przy wszystkich procesach pojawi się ten sam numer TTY. I tak np. powyżej widać przy obu procesach, iż są uruchomione na ttyp0. Wskazuje to, iż są one uruchomione zdalnie albo też w trybie graficznym X Window.
Kolejna kolumna: TIME określa, jak wiele czasu pracy procesora zajmuje dany proces. Jej wartość jest różna od czasu, który upłynął od uruchomienia procesu. Trzeba pamiętać, że Linuks to system wielozadaniowy. W danej chwili uruchomionych jest wiele procesów; każdy z nich otrzymuje część czasu pracy procesora. Tak więc, kolumna TIME pokazuje, ile mniej więcej czasu dany proces już pracuje. Jeżeli w tej kolumnie pokazują się wartości większe niż kilka minut - można zacząć podejrzewać, że coś jest nie tak.
I ostatnia kolumna, CMD, pokazująca o którym to programie jest właściwie mowa. Pokazuje jedynie nazwy samych programów, nie mówiąc nic na temat opcji z którymi programy były wywołane. By uzyskać tego typu informacje, trzeba uruchomić ps z jedną z jego wielu opcji. Omówimy to krótko.
Możesz otrzymać kompletną listę programów działających w systemie używając kombinacji kilku opcji. Zaowocuje to zapewne dość długą listą pozycji (równe 70 na komputerze, na którym piszę teraz to tłumaczenie), tak więc przytnę trochę wyjście:
% ps -ax PID TTY STAT TIME COMMAND 1 ? S 0:03 init [3] 2 ? SW 0:13 [kflushd] 3 ? SW 0:14 [kupdate] 4 ? SW 0:00 [kpiod] 5 ? SW 0:17 [kswapd] 11 ? S 0:00 /sbin/kerneld 30 ? SW 0:01 [cardmgr] 50 ? S 0:00 /sbin/rpc.portmap 54 ? S 0:00 /usr/sbin/syslogd 57 ? S 0:00 /usr/sbin/klogd -c 3 59 ? S 0:00 /usr/sbin/inetd 61 ? S 0:04 /usr/local/sbin/sshd 63 ? S 0:00 /usr/sbin/rpc.mountd 65 ? S 0:00 /usr/sbin/rpc.nfsd 67 ? S 0:00 /usr/sbin/crond -l10 69 ? S 0:00 /usr/sbin/atd -b 15 -l 1 77 ? S 0:00 /usr/sbin/apmd 79 ? S 0:01 gpm -m /dev/mouse -t ps2 94 ? S 0:00 /usr/sbin/automount /auto file /etc/auto.misc 106 tty1 S 0:08 -bash 108 tty3 SW 0:00 [agetty] 109 tty4 SW 0:00 [agetty] 110 tty5 SW 0:00 [agetty] 111 tty6 SW 0:00 [agetty] [output cut] |
Większość tych procesów zostaje uruchomiona jeszcze przy starcie większości systemów. Dokonałem pewnych zmian w swoim systemie, tak więc u ciebie spis ten będzie zapewne trochę inny. Niemniej jednak, większość z tych procesów zobaczysz także u siebie. Jak widzisz, opcje podane przy wywołaniu ps powodują wyświetlenie opcji wywołania wszystkich procesów. Ostatnimi czasy, wrażliwość jądra systemu na ptrace sprawiła, że stworzono poprawkę dzięki której nie są podawane opcje wywołania dla wielu różnych działających w systemie procesów. Przykładem są te wylistowane wyżej w nawiasach pozycje o PID'ach od 108 do 110. Powyższy wypis pokazuje też jedną kolumnę więcej niż poprzedni oraz przynosi ciut więcej ciekawych informacji.
Jako pierwsze zauważysz na pewno, iż większa część procesów została uruchomiona na konsoli numer “?”. Takie procesy nie są związane z żadnym konkretnym terminalem. Najczęściej dzieje się tak w wypadku demonów, które to właśnie są procesami nie wiążącymi się z żadnym konkretnym terminalem. Bardziej znane demony to np. sendmail, BIND, apache oraz NFS. Typowym ich zadaniem jest oczekiwanie na żądanie wysłane przez klienta oraz udzielenie odpowiedzi na nie.
Druga rzecz: pojawia się nowa kolumna STAT. Pokazuje ona status danego procesu. S (skrót od ang. "sleeping") oznacza uśpiony: proces w tym stanie oczekuje na jakieś zdarzenie. Z oznacza proces-zombie. Proces-zombie to proces, którego rodzic zakończył swe działanie ("umarł"), pozostawiając nie zakończony proces potomny. Nie jest to dobra rzecz. D oznacza proces który jest uśpiony tak mocno, że nie można go "obudzić" - procesy w takim stanie często nie reagują nawet na komendę SIGKILL (więcej o SIGKILL przeczytasz już niedługo w podrozdziale kill). W oznacza stronicowanie. Proces martwy jest oznaczony przez X. Proces z literką T jest albo śledzony (ang. "traced"), albo zatrzymany. R oznacza, iż proces jest gotów do wykonania.
Jeżeli chcesz zobaczyć jeszcze więcej informacji na temat uruchomionych procesów, spróbuj tego:
% ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 344 80 ? S Mar02 0:03 init [3] root 2 0.0 0.0 0 0 ? SW Mar02 0:13 [kflushd] root 3 0.0 0.0 0 0 ? SW Mar02 0:14 [kupdate] root 4 0.0 0.0 0 0 ? SW Mar02 0:00 [kpiod] root 5 0.0 0.0 0 0 ? SW Mar02 0:17 [kswapd] root 11 0.0 0.0 1044 44 ? S Mar02 0:00 /sbin/kerneld root 30 0.0 0.0 1160 0 ? SW Mar02 0:01 [cardmgr] bin 50 0.0 0.0 1076 120 ? S Mar02 0:00 /sbin/rpc.port root 54 0.0 0.1 1360 192 ? S Mar02 0:00 /usr/sbin/sysl root 57 0.0 0.1 1276 152 ? S Mar02 0:00 /usr/sbin/klog root 59 0.0 0.0 1332 60 ? S Mar02 0:00 /usr/sbin/inet root 61 0.0 0.2 1540 312 ? S Mar02 0:04 /usr/local/sbi root 63 0.0 0.0 1796 72 ? S Mar02 0:00 /usr/sbin/rpc. root 65 0.0 0.0 1812 68 ? S Mar02 0:00 /usr/sbin/rpc. root 67 0.0 0.2 1172 260 ? S Mar02 0:00 /usr/sbin/cron root 77 0.0 0.2 1048 316 ? S Mar02 0:00 /usr/sbin/apmd root 79 0.0 0.1 1100 152 ? S Mar02 0:01 gpm root 94 0.0 0.2 1396 280 ? S Mar02 0:00 /usr/sbin/auto chris 106 0.0 0.5 1820 680 tty1 S Mar02 0:08 -bash root 108 0.0 0.0 1048 0 tty3 SW Mar02 0:00 [agetty] root 109 0.0 0.0 1048 0 tty4 SW Mar02 0:00 [agetty] root 110 0.0 0.0 1048 0 tty5 SW Mar02 0:00 [agetty] root 111 0.0 0.0 1048 0 tty6 SW Mar02 0:00 [agetty] [output cut] |
To już całkiem sporo informacji. Generalnie, dowiadujemy się tu który użytkownik
uruchomił dany proces, jak wiele zasobów systemowych proces zajmuje (kolumny %CPU, %MEM,
VSZ oraz RSS), oraz kiedy proces został uruchomiony. Oczywiście, taka ilość informacji
będzie bardzo pomocna dla administratora systemu. Ale pojawia się tu drobny problem:
część tak obfitej informacji przekracza szerokość ekranu, przez co zostaje wyświetlona
niepełna jej część. Opcja -w
zmusi ps do przełamania długich linii.
Niezbyt to piękne, ale spełnia swoje zadanie. Teraz masz już potężną rozpiskę dla każdego procesu. Ale można usyskać o procesach jeszcze więcej informacji - sprawdź bardzo dogłębną stronę manuala na temat komendy ps. Co by jednak nie było, opcje podane powyżej są najbardziej popularne i to ich właśnie będziesz używał najczęściej.