11.3. ps

Итак, теперь вы знаете как переключаться между несколькими процессами, запущенными из командной строки. А также вы знаете, что в системе постоянно выполняется много других процессов. Так каким же образом можно получить перечень всех этих программ? Для этого вам нужно воспользоваться командой ps(1). У этой команды есть много опций, поэтому мы рассмотрим только самые важные из них. Чтобы получить полный список опций, обратитесь к странице руководства ps. Использование страниц руководства подробно рассмотрено в Разд. 2.1.1.

Просто наберите ps, чтобы получить список программ, выполняемых в вашем терминале. В этот список входят процессы, работающие в приоритетном режиме (любой командный процессор, в котором вы работаете, и сама команда ps). Также перечисляются фоновые процессы, которые могут выполняться в данный момент. В большинстве случаев это будет очень короткий список:

Рисунок 11-1. Наиболее общий вывод команды ps

% ps
   PID TTY          TIME CMD
  7923 ttyp0    00:00:00 bash
  8059 ttyp0    00:00:00 ps

И хотя процессов здесь не так уж и много, это весьма типичная информация. Вы увидите те же самые колонки при использовании ps, независимо от того, сколько процессов выполняется в системе. Что же это тогда значит?

PID - это идентификатор процесса (process ID). Все работающие процессы имеют уникальные идентификаторы в диапазоне от 1 до 32767. Каждому новому процессу присваивается следующий свободный PID. Когда процесс завершает свою работу (или убивается, как вы увидите в следующем разделе), он освобождает свой PID. При достижении в системе максимального PID, следущим берётся первый свободный PID с наименьшим номером и так по кругу.

Колонка TTY обозначает терминал, в котором выполняется процесс. При простом вызове ps будет выведен список только тех программ, которые выполняются в текущем терминале. Поэтому все процессы будут иметь одну и ту же информацию в колонке TTY. Как видно в примере, оба процесса в списке выполняются в терминале ttyp0. Это означает, что они выполняются или удалённо, или в каком-нибудь X-терминале.

Колонка TIME содержит данные о времени, в течение которого процесс использует ресурсы центрального процессора. Однако это не то время, в течение которого выполняется процесс. Помните, что Linux является многозадачной операционной системой. В ней постоянно выполняется множество процессов и каждый из них получает небольшую порцию процессорного времени. Поэтому колонка TIME должна содержать для каждого процесса как можно меньшее значение времени по сравнению с тем временем, в течение которого выполняется этот процесс. Если вы видите в этой колонке значение более нескольких минут, это может означать, что что-то идёт не так.

И наконец в колонке CMD представлена сама программа. В ней отображается только имя программы, безо всяких опций командной строки или подобной информации. Для получения этой информации вам нужно использовать одну из множества опций команды ps. Мы вкратце рассмотрим их здесь.

Вы можете получить полный список процессов, выполняемых в вашей системе, используя правильный набор опций. Это скорее всего приведёт к тому, что вы получите большой список процессов (на моём ноутбуке на время написания этого предложения их было 55 (а на моём ПК - 110 :) - прим. переводчика), поэтому я несколько сокращу вывод:

% 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]
 [вывод сокращён]

Большинство этих процессов запускаются во время загрузки на большинстве систем. Я внёс некоторые изменения в свою систему, поэтому ваш список наверняка будет совершенно иным. Однако вы увидите большинство этих процессов и в своей системе. Как видите, эти опции позволили получить опции командной строки выполняемых процессов. Уязвимость в ядре в функции ptrace стала причиной исправления кода ядра, в результате которого для многих выполняемых процессов больше не показываются опции командной строки. В данном примере названия этих процессов заключены в квадратные скобки, например у процессов с PID'ами от 108 до 111. В этом листинге также появилось несколько новых колонок и некоторая другая интересная информация.

Во-первых, вы заметите, что большинство процессов в списке работают в tty“?”. Они не привязаны ни к одному из терминалов. Это является самым распространённым случаем для демонов, т.е. процессов, которые выполняются без привязки к какому-либо терминалу. Примеры демонов: sendmail, BIND, apache и NFS. Обычно они ожидают запросов от клиентов и возвращают информацию на полученные запросы.

Во-вторых, здесь появился новый столбец: STAT. В нём отображается состояние процесса. S означает, что процесс спит (sleeping), т.е. ожидает какого-либо события. Z означает процесс-зомби. Такой процесс появляется в том случае, когда умирает его родительский процесс, оставив после себя дочерний процесс. Это нехорошая ситуация. D означает процесс, который перешёл в “непробудный” сон. Часто такие процессы невозможно убить даже путём отправки им сигнала SIGKILL. Вы узнаете больше о SIGKILL в следующем разделе, посвящёном команде kill. W означает paging (страничную подкачку файлов). Мёртвые процессы обозначаются как X. Процессы, отмеченные как T, трассируются или остановлены. R означает, что процесс можно запустить.

Если вы хотите получить ещё более подробную информацию о выполняемых процессах, попробуйте выполнить следующую команду:

% 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]
 [вывод сокращён]

Это практически вся информация о системе. В ней присутствует дополнительная информация о процессе: какой пользователь его запустил, сколько он использует системных ресурсов (колонки %CPU, %MEM, VSZ и RSS) и когда был запущен. Очевидно, что такая подробная информация может пригодиться системному администратору. Следует отметить ещё один момент: данные теперь вылезают за пределы экрана, и вы не можете увидеть их полностью. Опция -w заставит ps переносить длинные строки.

Это не слишком удобно, но это работает. Теперь в вашем распоряжении полный отчёт по всем процессам. Существует даже ещё более подробная информация, которую вы можете получить о процессе. Обратитесь к хорошей странице руководства по команде ps. Тем не менее представленные выше опции являются самыми популярными, и скорее всего именно их вы будете использовать наиболее часто.