11.3 ps

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.

Grenlandia 2012