Linux. Команда ps
Команда ps
выводит список текущих процессов в виде таблицы, с которой можно удобно работать — сортировать, изменять количество колонок и прочее. У команды есть множество опций, с помощью которых можно тонко настраивать вывод. Можно использовать команду в конвейере, чтобы отсечь все лишнее.
Суть работы команды ps
в том, что она собирает данные из специальной директории /etc/proc
, в которой находятся сведения о процессах и представляет их в удобной для восприятия форме. С работой команды ps
в Linux всё просто, а вот разобраться в том, что такое процесс — немного сложнее.
Что такое процесс
Процесс Linux — это экземпляр программы, запущенный в собственном независимом виртуальном адресном пространстве (части памяти). Это сделано для безопасности, чтобы один процесс не мог влиять на работу других. Из этих же соображений сделана специальная директория /etc/proc
, чтобы процессы не могли влиять на работу ядра.
Процессов может быть запущено огромное количество, в том числе по несколько экземпляров от имени одного и того же пользователя. Чтобы ядро Linux могло различать эти процессы, существую идентификаторы процессов — PIDs (Process Identificator Number).
Так как процесс — это экземпляр программы, то для его запуска требуются ресурсы и процессорное время, поэтому процесс может находиться в разных состояниях:
- Ожидание — процесс ожидает сигнала для запуска или выделения системных ресурсов
- Выполнение — процесс запущен, либо готов к запуску
- Завершен — процесс был остановлен, получением сигнала завершения работы
- Зомби — такой статус получают дочерние процессы, когда родительский процесс завершается раньше них.
Все процессы в Linux имеют своего родителя и построены в древовидном виде. Стартовый процесс — первый процесс в пользовательском пространстве — это init-процесс, он порождает другие процессы.
Использование команды
Опций у команды ps
очень много, чтобы разобраться в них, давайте разделим их на две группы.
- Опции выбора процессов для отображения
- Опции работы с форматом вывода данных
Кроме того, допускается использование опций без дефиса и опций с дефисом. Причем, опция с дефисом может означать совсем другое, чем такая же опция без дефиса. Например, опция u
означает ориенитрованный на пользователя формат, а опция -u
предписывает выбирать процессы по UID
. Чтобы не запутаться, будем по возможности использовать только опции с дефисом.
1. Выбор процессов для показа
Начнем с опций первой группы, помогающих выбрать нужные процессы для отображения их состояний.
-A, -e
— выбрать все процессы-d
— выбрать все процессы, кроме лидеров сеансов-a
— выбрать все процессы, кроме лидеров сеансов и процессов, не связанных с терминалом-С
— выбирать процессы по имени команды-G
— выбирать процессы по идентификатору группыGID
-p
— выбирать процессы по идентификаторуPID
--ppid
— выбирать процессы поPID
родительского процессаr
(без дефиса) — выбрать только работающие (running) процессы-s
— выбрать процессы по идентификатору сессии-t
— выбрать процессы по терминалу tty-u
— выбрать процессы пользователя поUID
(эффективный)-U
— выбрать процессы пользователя поUID
(реальный)
PID
равен SID
. Когда один процесс запускает другие процессы, он является лидером сеанса всех других процессов. Допустим, есть процесс A, который запускает процессы B и C. Процесс B запускает процесс D, процесс C запускает процесс E. При использовании команды ps -d
— мы увидим процессы B, C, D и E, но не A.
$ ps -e # показать все процессы
$ ps -C firefox # показать процесс firefox PID TTY TIME CMD 2905 ? 00:00:08 firefox $ ps -e | grep firefox # показать процесс firefox 2905 ? 00:00:10 firefox
$ ps -u root -U root # показать процессы пользователя root
2. Внешний вид таблицы процессов
Теперь рассмотрим опции второй группы, помогающих настроить вид таблицы списка процессов.
-f
— полный формат-F
— самый полный форматf, --forest
— дерево процессов-H
— иерархия процессов-l
— длинный формат-o, --format
— пользовательский форматu
— user-oriented format
$ ps -f # полный формат UID PID PPID C STIME TTY TIME CMD evgeniy 2295 2287 0 11:46 pts/0 00:00:00 bash evgeniy 3280 2295 0 14:16 pts/0 00:00:00 ps -f
$ ps -F # самый полный формат UID PID PPID C SZ RSS PSR STIME TTY TIME CMD evgeniy 2295 2287 0 4845 4904 0 11:46 pts/0 00:00:00 bash evgeniy 3279 2295 0 5040 3484 0 14:16 pts/0 00:00:00 ps -F
$ ps -u evgeniy f # дерево процессов PID TTY STAT TIME COMMAND 1513 tty2 Ssl+ 0:00 /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_MODE=ubuntu... 1518 tty2 Sl+ 0:29 \_ /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority ... 1609 tty2 Sl+ 0:00 \_ /usr/libexec/gnome-session-binary --systemd --systemd --session=ubuntu 1726 ? Ss 0:00 \_ /usr/bin/ssh-agent /usr/bin/im-launch env GNOME_SHELL_SESSION_MODE=ub... 1720 ? S 0:00 /usr/bin/VBoxClient --vmsvga-session 1721 ? Sl 0:03 \_ /usr/bin/VBoxClient --vmsvga-session 1711 ? S 0:00 /usr/bin/VBoxClient --draganddrop 1712 ? Sl 0:35 \_ /usr/bin/VBoxClient --draganddrop 1703 ? S 0:00 /usr/bin/VBoxClient --seamless 1704 ? Sl 0:11 \_ /usr/bin/VBoxClient --seamless 1688 ? S 0:00 /usr/bin/VBoxClient --clipboard 1689 ? Sl 0:00 \_ /usr/bin/VBoxClient --clipboard 1509 ? Sl 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login 1498 ? Ss 0:00 /lib/systemd/systemd --user 1499 ? S 0:00 \_ (sd-pam) 1504 ? S<sl 0:00 \_ /usr/bin/pulseaudio --daemonize=no --log-target=journal 1506 ? SNsl 0:00 \_ /usr/libexec/tracker-miner-fs 1515 ? Ss 0:00 \_ /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --s... 1524 ? Ssl 0:00 \_ /usr/libexec/gvfsd 1887 ? Sl 0:00 | \_ /usr/libexec/gvfsd-trash --spawner :1.3 /org/gtk/gvfs/exec_spaw/0
Колонки таблицы процессов
По умолчанию команда ps
показывает таблицу процессов, в которой четыре колонки — PID
, TTY
, TIME
и CMD
. При использовании опции -f
— будут показаны колонки UID
, PID
, PPID
, C
, STIME
, TTY
, TIME
и CMD
.
UID
— пользователь, от имени которого запущен процессPID
— идентификатор процессаPPID
— идентификатор родительского процессаC
— использование времени процессора в процентахSTIME
— время запуска процессаTTY
— терминал, из которого запущен процессTIME
— общее время процессора, затраченное на выполнение процессаCMD
— команда запуска процесса
Опция -F
добавит еще три колонки в таблицу процессов
SZ
— размер процесса в памяти, Кбайт (с учетом swap)RSS
— размер процесса в памяти, Кбайт (без учета swap)PSR
— ядро процессора, на котором выполняется процесс
Пользовательский формат таблицы
Задается опцией -o
или --format
— после которой нужно перечислить коды полей таблицы для показа.
%cpu
илиpcpu
(колонка%CPU
) — использование времени процессора в процентах, формат##.#
%mem
илиpmem
(колонка%MEM
) — использование оперативной памяти в процентах (без учета swap)cmd
илиargs
(колонкаCMD
илиCOMMAND
) — команда запуска процесса с аргументамиc
(колонкаC
) — использование времени процессора в процентах, целое числоstime
илиstart_time
(колонкаSTIME
илиSTART
) — дата или время запуска процессаs
илиstate
(колонкаS
илиSTATE
) — состояние процесса (один символ)stat
(колонкаSTAT
) — состояние процесса (несколько символов)uid
илиeuid
(колонкаUID
илиEUID
) — эффективный идентификаторUID
user
илиeuser
(колонкаUSER
илиEUSER
) — эффективное имя пользователя
$ ps -u evgeniy -o user,pcpu,pmem,stime,s,cmd USER %CPU %MEM STIME S CMD evgeniy 0.0 0.2 11:59 S /lib/systemd/systemd --user evgeniy 0.0 0.1 11:59 S (sd-pam) evgeniy 0.0 0.1 11:59 S /usr/bin/pipewire evgeniy 0.0 0.1 11:59 S /usr/bin/pipewire-media-session evgeniy 0.0 0.6 11:59 S /usr/bin/pulseaudio --daemonize=no --log-target=journal evgeniy 0.0 0.1 11:59 S /usr/bin/gnome-keyring-daemon --daemonize --login evgeniy 0.0 0.1 11:59 S /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd... evgeniy 0.0 0.1 11:59 S /usr/libexec/gdm-wayland-session env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gn... evgeniy 0.0 0.3 11:59 S /usr/libexec/gnome-session-binary --session=ubuntu evgeniy 0.0 0.2 11:59 S /usr/libexec/gvfsd evgeniy 0.0 0.1 11:59 S /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f evgeniy 0.0 0.1 11:59 S /usr/libexec/xdg-document-portal evgeniy 0.0 0.1 11:59 S /usr/libexec/xdg-permission-store evgeniy 0.0 0.1 11:59 S /usr/libexec/gnome-session-ctl --monitor evgeniy 0.0 0.4 11:59 S /usr/libexec/gnome-session-binary --systemd-service --session=ubuntu evgeniy 1.5 9.1 11:59 R /usr/bin/gnome-shell ..........
Сортировка процессов по полю
Задается опцией --sort
— после которой нужно указать код поля таблицы для сортировки. По умолчанию сортировка будет по возрастанию, для сортировки по убыванию нужно добавить дефис перед кодом поля.
$ ps -u evgeniy -o user,pcpu,pmem,stime,s,cmd --sort -pmem USER %CPU %MEM STIME S CMD evgeniy 1.5 9.1 11:59 S /usr/bin/gnome-shell evgeniy 0.3 8.9 12:50 S /snap/firefox/2908/usr/lib/firefox/firefox evgeniy 0.0 2.8 12:50 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser... evgeniy 0.0 2.2 12:50 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser... evgeniy 0.0 2.1 12:51 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser... evgeniy 0.0 2.1 11:59 S /usr/bin/Xwayland :0 -rootless -noreset -accessx -core -auth /run/user/1000/.mut... evgeniy 0.0 2.0 12:00 S /usr/libexec/gsd-xsettings evgeniy 0.0 1.6 11:59 S /usr/libexec/evolution-data-server/evolution-alarm-notify evgeniy 0.0 1.6 12:51 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser... evgeniy 0.0 1.6 12:51 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser... evgeniy 0.0 1.6 12:51 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser... evgeniy 0.0 1.5 12:00 S gjs /usr/share/gnome-shell/extensions/ding@rastersoft.com/ding.js -E -P /usr/sha... evgeniy 0.3 1.5 12:00 S /usr/libexec/gnome-terminal-server evgeniy 0.0 1.0 11:59 S /usr/libexec/goa-daemon evgeniy 0.0 0.9 12:50 S /snap/firefox/2908/usr/lib/firefox/firefox -contentproc -parentBuildID 202307102... evgeniy 0.0 0.7 11:59 S /usr/libexec/evolution-calendar-factory ..........
$ ps -u evgeniy -o user,pcpu,pmem,stime,s,cmd --sort -pcpu USER %CPU %MEM STIME S CMD evgeniy 1.5 9.1 11:59 S /usr/bin/gnome-shell evgeniy 1.0 0.4 15:18 S /usr/bin/php app.php evgeniy 0.5 0.4 15:18 S /usr/bin/php app.php evgeniy 0.3 0.0 12:00 S /usr/bin/VBoxClient --draganddrop evgeniy 0.3 1.5 12:00 S /usr/libexec/gnome-terminal-server evgeniy 0.3 8.9 12:50 S /snap/firefox/2908/usr/lib/firefox/firefox evgeniy 0.1 0.4 15:18 S /usr/bin/php app.php evgeniy 0.0 0.4 11:59 S /usr/bin/python3 -m http.server 8081 --directory=/home/evgeniy/web-server evgeniy 0.0 0.2 11:59 S /lib/systemd/systemd --user evgeniy 0.0 0.1 11:59 S (sd-pam) evgeniy 0.0 0.1 11:59 S /usr/bin/pipewire evgeniy 0.0 0.1 11:59 S /usr/bin/pipewire-media-session evgeniy 0.0 0.6 11:59 S /usr/bin/pulseaudio --daemonize=no --log-target=journal evgeniy 0.0 0.1 11:59 S /usr/bin/gnome-keyring-daemon --daemonize --login evgeniy 0.0 0.1 11:59 S /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd... evgeniy 0.0 0.1 11:59 S /usr/libexec/gdm-wayland-session env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gn... ..........
Статусы процессов в таблице
Статусы процессов, краткий формат, один символ
S (sleeping)
— спящийR (running)
— в работеZ (zombie)
— зомбиD (uninterruptible sleep)
— в состоянии подкачки из swapT (stopped by job control signal)
— остановлен специальным сигналомt (stopped by debugger during trace)
— остановлен в процессе дебагаI (idle)
— бездействующий процесс