Linux. Команда ps

23.07.2023

Теги: CLILinuxКомандаПроцесс

Команда 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) — в состоянии подкачки из swap
  • T (stopped by job control signal) — остановлен специальным сигналом
  • t (stopped by debugger during trace) — остановлен в процессе дебага
  • I (idle) — бездействующий процесс

Поиск: CLI • Linux • Команда • ps • Процесс

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.