Итак, теперь вы знаете как переключаться между несколькими процессами, запущенными из командной строки. А также вы знаете, что в системе постоянно выполняется много других процессов. Так каким же образом можно получить перечень всех этих программ? Для этого вам нужно воспользоваться командой 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. Тем не менее представленные выше опции являются самыми популярными, и скорее всего именно их вы будете использовать наиболее часто.