Основным инструментом для исследования процессов является команда ps. Она выводит состояние процессов на момент ее выполнения в системе. Без опций она выводит список процессов, связанных с текущим терминалом (пример 5.7).
Пример 5.7. Команда ps
$ ps
PID TTY TIME CMD
1751 pts/0 00:00:00 bash
1890 pts/0 00:00:00 ps
Столбец PID (см. пример 5.7) отображает идентификаторы процессов, TTY — имена терминалов, TIME — суммарное процессорное время, затра- ченное процессом с момента его старта. Столбец CMD — командная строка процесса.
Подробную информацию можно получить с помощью опции -f (full format).
Пример 5.8. Подробный формат вывода команды ps -f
$ ps -f
UID
PID
PPID
C STIME
TTY
TIME
CMD
user1
0 21:01
pts/0
00:00:00
bash
user1
0 23:14
pts/0
00:00:00
ps -f
Как видно из примера 5.8, в вывод добавляются дополнительные столбцы с информацией о UID владельца процесса, родителе процесса (PPID), столбец STIME показывает время запуска процесса, столбец C — фактор загрузки про- цессора (требуется планировщику для расчета приоритета процесса).
Еще более подробную информацию предоставляет опция -l (long format).
Пример 5.9. Длинный формат вывода команды ps -l
$ ps -l
F S
UID
PID
PPID
C PRI
NI
ADDR SZ
WCHAN TTY
TIME
CMD
0 S
0 76
- 781
11c541 pts/0
00:00:00
bash
0 R
0 77
- 617
- pts/0
00:00:00
ps
В примере 5.9 столбец F показывает флаги процесса (см. man ps).
Столбец S — статус процесса, который может быть:
r D — процесс приостановлен и не может быть прерван (например, ожидает окончания ввода/вывода);
r R — процесс выполняется или находится в очереди;
r S — процесс приостановлен;
r T — процесс трассируется;
r Z — процесс помечен как defunct (zombie).
Столбец NI показывает величину nice number. Эта величина устанавливается пользователем и участвует в вычислении приоритета процесса планировщи- ком. Столбец SZ — количество памяти, занимаемое процессом, а WCHAN — это информация о системном вызове, произведенном процессом.
Исключительно полезна опция -e, позволяющая вывести список всех процессов в системе (аналог — опция –A). Чаще всего для получения списка всех процессов используют команду ps -ef, дающую подробную информацию о процессах.
Бывает необходимо вывести список каких-либо конкретных процессов, вы- бранных по заданному критерию. Далее приведены некоторые опции фильт- рации ps:
r -u — фильтрация по UID;
r -t — фильтрация по терминалу;
r -p — фильтрация по PID искомого процесса;
r -C — фильтрация по командной строке.
Требуется, например, вывести список процессов, запущенных на втором вир- туальном терминале (пример 5.10).
Пример 5.10. Фильтрация процессов по заданному терминалу
Вывести список процессов с заданной командной строкой можно, указав по- сле опции -C команды ps имя требуемой команды, например, ps -C bash. Имеется также команда pgrep, позволяющая получить PID процессов по за- данной командной строке, например, pgrep bash.
Все приведенные выше команды соответствуют POSIX-формату, однако GNU-версия программы ps поддерживает также опции и в BSD-стиле. Наи- более популярной командой в таком формате является ps aux — она выводит список всех процессов в системе с указанием их владельцев. В примере 5.11 приведен небольшой фрагмент из ее вывода.
Пример 5.11. Опции команды ps в BSD-стиле
$ ps
aux
USER
PID %CPU %MEM VSZ RSS TTY
STAT START
TIME COMMAND
root
1 0.0 0.1 1268 60 ?
S Oct08
0:04 init
Эта команда отобразила в виде процентов уровень загрузки процессора и па- мяти данным процессом. Столбец VSZ — объем используемой процессом виртуальной памяти, а RSS — физической памяти.
Опции POSIX, BSD и длинные опции GNU команды ps можно комбини- ровать.
Пример 5.12. Комбинация опций команды ps в POSIX- и BSD-стилях
$ ps -f U root
UID PID PPID C STIME TTY STAT TIME CMD
root 1 0 0 06:18 ? S 0:04 init
root 2 1 0 06:18 ? SW 0:00 [keventd]
Пример 5.12 содержит фрагмент вывода команды ps –f U root. В этом при- мере для выбора процессов пользователя root была использована опция в BSD-стиле U, а POSIX-опция -f была задана для указания подробного форма- та вывода.
В процессах могут быть созданы последовательности параллельно испол- няющихся инструкций, называемых потоками (threads) или облегченными процессами (LWP, Light Weight Process). Для получения информации о пото- ках необходимо использовать опцию –L (пример 5.13).
Пример 5.13. Получение информации о потоках
$ ps -fLC swriter.bin
UID
PID
PPID
LWP
C
NLWP STIME
TTY TIME CMD
user1
5 Oct13
? 00:00:50 swriter.bin
-writer
user1
5 Oct13
? 00:00:00 swriter.bin
-writer
user1
5 Oct13
? 00:00:00 swriter.bin
-writer
user1
5 Oct13
? 00:00:00 swriter.bin
-writer
user1
5 Oct13
? 00:00:00 swriter.bin
-writer
В примере 5.13 демонстрируется, что у процесса swriter.bin (Open Office) PID равен 2891. В этом процессе имеется пять потоков со своими идентифи- каторами, выводимыми в столбце LWP.
Для постоянного мониторинга процессов используется утилита top, которая отображает исполняющиеся процессы, отнимающие большую часть процес- сорного времени и наиболее сильно использующие память.
Утилита top регулярно обновляет информацию о процессах. Для выхода из нее необходимо набрать q. Эта команда позволяет, не выходя из интерактив- ного просмотра процессов, посылать процессам сигналы с помощью нажатия k. Нажатие i отключает вывод top неактивных процессов. В первой строке эк- рана вывода команды приводятся данные о средней загруженности системы (load averages) за последние 1, 5 и 15 минут.
Удобно использовать также команду w, демонстрирующую список всех во- шедших в сеанс пользователей и запущенные ими задания (пример 5.14).
Исключительно важным инструментом, позволяющим получить информа- цию о процессах в системе, является каталог /proc (пример 5.15). То, что в нем находится, не является в полном смысле файлами — это псевдофайло- вая система, порождаемая ядром. Она позволяет выводить информацию о процессах, получать и устанавливать параметры ядра на лету.
Пример 5.15. Файловая система /proc
$ ls
/proc
driver
kcore
mtrr
sys
execdomains
kmsg
net
sysvipc
fb
ksyms
partitions tty
apm
filesystems
loadavg
pci uptime
asound
fs
locks
scsi version
bus
ide
mdstat
self
cmdline
interrupts
meminfo
slabinfo
cpuinfo
iomem
misc
splash
devices
ioports
modules
stat
dma
irq
mounts
swaps
Подкаталоги /proc с именами, состоящими из цифр, соответствуют PID про- цессов.
Определим, например, PID текущей оболочки и исследуем соответствующий ее процессу каталог (пример 5.16).
Пример 5.16. Файлы в /proc
$ pgrep bash 1751
$ ls /proc/1751
cmdline cwd environ exe fd maps mem mounts root stat statm status
$ cat /proc/1751/cmdline bash
Файл cmdline содержит в себе командную строку процесса, а файл status — подробную информацию о статусе процесса. Подкаталог fd предназначен для мониторинга файлов, открытых процессом. В нем содержатся символи- ческие ссылки на реально открытые файлы процессом. Имена этих симво- лических ссылок соответствуют номерам файловых дескрипторов откры- тых файлов.
Исключительно важной является команда fuser, позволяющая определить, какие процессы открыли заданный файл. В примере 5.17, приведенном далее, пользователь смонтировал DVD в каталоге /mnt/dvd, перешел в этот каталог и получил информацию о процессе, использующем этот каталог.
Пример 5.17. Команда fuser
$ mount /mnt/dvd
$ cd /mnt/dvd/
$ /sbin/fuser .
.: 1751c
$ ps –p 1751
PID TTY TIME CMD
1751 pts/0 00:00:00 bash
Команда fuser вывела PID процесса оболочки, т. к. для нее этот каталог яв- ляется текущим. Этот факт команда fuser подтверждает, выводя c после PID процесса.
Команда fuser выводит следующие символы после PID процессов:
r c — текущий каталог;
r e — исполняемый файл в момент его работы;
r f — открытый файл;
r r — корневой каталог;
r m — разделяемая библиотека либо отображаемый в память файл.
Опция -m команды fuser позволяет указать, что имя файла является именем смонтированного блочного устройства (пример 5.18).
Пример 5.18. Опция -m команды fuser
$ /sbin/fuser -m /dev/dvd
/dev/dvd: 1751c
Для просмотра списка процессов в виде дерева, отображающего отношения родительских и дочерних процессов, необходимо выполнить команду pstree.
Пример 5.19. Команда pstree
$pstree
init-+-2*[automount]
|-cron
|-6*[getty]
|-inetd
В примере 5.19 приведен фрагмент иерархического списка процессов.