Утилита ps – изучаем процессы

Здесь будет рассмотрена утилита ps, с помощью которой мы можем изучать работающие процессы в системе Linux.

Утилита ps

Утилита ps показывает срез информации на данный момент времени. То есть некоторые свойства процесса могут изменяться со временем. Например, используемая оперативная память может вырасти или уменьшится. А команда ps покажет занимаемую память процессом в данный момент.

Вы можете почитать официальный мануал по команде ps здесь, или выполните команду man ps.

Данная утилита обычно входит в дистрибутив и устанавливать её нет необходимости.

Ниже рассмотрим несколько примеров работы утилиты.

Просмотр общего списка процессов

Если вызвать ps без аргументов то увидим процессы своего пользователя привязанные к текущему терминалу (TTY):

$ ps
    PID TTY          TIME CMD
  19104 pts/0    00:00:00 bash
  19113 pts/0    00:00:00 ps

Чтобы посмотреть все процессы в системе используют опции ax, я добавил head чтобы вывести первые 10 процессов, так как их много:

$ ps -ax | head
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:02 /sbin/init
      2 ?        S      0:00 [kthreadd]
      3 ?        I<     0:00 [rcu_gp]
      4 ?        I<     0:00 [rcu_par_gp]
      5 ?        I<     0:00 [slub_flushwq]
      6 ?        I<     0:00 [netns]
      8 ?        I<     0:00 [kworker/0:0H-events_highpri]
     10 ?        I<     0:00 [mm_percpu_wq]
     11 ?        I      0:00 [rcu_tasks_kthread]

Давайте разберемся с этими опциями:

  • a — показать все процессы у которых есть управляющий терминал.
  • x — показать все процессы у которых нет управляющего терминала.

Также чтобы вывести все процессы можно воспользоваться опцией -e, при этом вы не увидите состояния процессов:

$ ps -e | head
    PID TTY          TIME CMD
      1 ?        00:00:02 systemd
      2 ?        00:00:00 kthreadd
      3 ?        00:00:00 rcu_gp
      4 ?        00:00:00 rcu_par_gp
      5 ?        00:00:00 slub_flushwq
      6 ?        00:00:00 netns
      8 ?        00:00:00 kworker/0:0H-events_highpri
     10 ?        00:00:00 mm_percpu_wq
     11 ?        00:00:00 rcu_tasks_kthread

Чтобы увидеть больше информации воспользуемся опцией u:

$ ps -e u | head
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 167724 12224 ?        Ss   окт23   0:02 /sbin/init
root           2  0.0  0.0      0     0 ?        S    окт23   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   окт23   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   окт23   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<   окт23   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I<   окт23   0:00 [netns]
root           8  0.0  0.0      0     0 ?        I<   окт23   0:00 [kworker/0:0H-events_highpri]
root          10  0.0  0.0      0     0 ?        I<   окт23   0:00 [mm_percpu_wq]
root          11  0.0  0.0      0     0 ?        I    окт23   0:00 [rcu_tasks_kthread]

Так как я показываю первые 10 процессов, а они отсортированы по pid, то сюда попали только процессы ядра, которые не имеют управляющего терминала.

Просмотр информации о конкретных процессах

Мы можем смотреть информацию о конкретном процессе, используя опцию -p и номер процесса:

alex@deb-11:~$ ps -p 1
    PID TTY          TIME CMD
      1 ?        00:00:04 systemd

$ ps -p 1 u
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 167724 12224 ?        Ss   окт23   0:02 /sbin/init

Можно вывести информацию сразу по нескольким процессам перечислив их через запятую:

$ ps u -p 1,2
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.3 167724 12224 ?        Ss   окт23   0:02 /sbin/init
root           2  0.0  0.0      0     0 ?        S    окт23   0:00 [kthreadd]

Ещё можно получить информацию по процессам определенного пользователя. Для этого используется опция -u и имя пользователя или его номер:

$ ps u -u www-data
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data   17678  0.0  0.3 1998924 12996 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   17679  0.0  0.3 1933388 12996 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start

$ ps u -u alex
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
alex       17406  0.0  0.2  19044 10684 ?        Ss   окт29   0:00 /lib/systemd/systemd --u
alex       17407  0.0  0.0 168784  3208 ?        S    окт29   0:00 (sd-pam)
alex       17422  0.0  0.2 162884 11724 ?        Ssl  окт29   0:00 /usr/bin/pulseaudio --da
alex       17427  0.0  0.1  17968  6860 ?        S    окт29   0:04 sshd: alex@pts/0
alex       17482  0.0  0.1   8988  4316 ?        Ss   окт29   0:00 /usr/bin/dbus-daemon --s
alex       19104  0.0  0.1   8104  4828 pts/0    Ss   11:28   0:00 -bash
alex       19148  0.0  0.1  11084  4416 pts/0    R+   11:38   0:00 ps u -u alex

Также можно вывести информацию определенной группы пользователей. Для этого используем опцию -g:

$ ps u -g www-data
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data   17678  0.0  0.3 1998924 12996 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   17679  0.0  0.3 1933388 12996 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start

Чтобы вывести информацию по процессам определенной программы воспользуемся опцией -C и именем программы:

$ ps u -C apache2
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         615  0.0  0.1   6564  5116 ?        Ss   окт23   0:14 /usr/sbin/apache2 -k sta
www-data   17678  0.0  0.3 1998924 12996 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   17679  0.0  0.3 1933388 12996 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start

$ ps u -C postgres
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postgres     608  0.0  0.7 253072 31228 ?        Ss   окт23   0:05 /usr/lib/postgresql/16/b
postgres     690  0.0  0.2 253236  8204 ?        Ss   окт23   0:00 postgres: 16/main: check
postgres     691  0.0  0.1 253220  5720 ?        Ss   окт23   0:02 postgres: 16/main: backg
postgres     736  0.0  0.2 253220  9728 ?        Ss   окт23   0:02 postgres: 16/main: walwr
postgres     737  0.0  0.2 254656  8576 ?        Ss   окт23   0:00 postgres: 16/main: autov
postgres     739  0.0  0.1 254684  6704 ?        Ss   окт23   0:00 postgres: 16/main: logic

Получение определённой информации

Вы уже познакомились с опцией u, которая показывает больше информации. Но можно самому указать какую информацию вы хотите увидеть используя опцию -o. А с опцией L получим список полей которые можем выводить:

$ ps L | tail
uunit        UUNIT
vsize        VSZ
vsz          VSZ
wbytes       WBYTES
wcbytes      WCBYTES
wchan        WCHAN
wchars       WCHARS
wname        WCHAN
wops         WOPS
zone         ZONE

Я использовал tail, чтобы вывести всего 10 строк, так как список полей очень велик. Всего существует 175 полей.

Например, выведем команду (comm) и командную строку (cmd):

$ ps -u alex -o comm,cmd
COMMAND         CMD
systemd         /lib/systemd/systemd --user
(sd-pam)        (sd-pam)
pulseaudio      /usr/bin/pulseaudio --daemonize=no --log-target=journal
sshd            sshd: alex@pts/0
dbus-daemon     /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --syste
bash            -bash
ps              ps -u alex -o comm,cmd

Или получим информацию по памяти:

$ ps -u alex -o comm,%mem,rss,vsz
COMMAND         %MEM   RSS    VSZ
systemd          0.2 10684  19044
(sd-pam)         0.0  3208 168784
pulseaudio       0.2 11724 162884
sshd             0.1  6860  17968
dbus-daemon      0.1  4316   8988
bash             0.1  4832   8104
ps               0.1  4408  11084

И по процессору:

$ ps -u alex -o comm,%cpu,cputime,cpuid
COMMAND         %CPU     TIME CPUID
systemd          0.0 00:00:00     3
(sd-pam)         0.0 00:00:00     2
pulseaudio       0.0 00:00:00     1
sshd             0.0 00:00:04     3
dbus-daemon      0.0 00:00:00     1
bash             0.0 00:00:00     2
ps               0.0 00:00:00     3

Получим информацию относящуюся к пользователям и идентификаторам:

$ ps -u alex -o comm,ppid,pid,user,uid,group,gid
COMMAND            PPID     PID USER       UID GROUP      GID
systemd               1   17406 alex      1000 alex      1000
(sd-pam)          17406   17407 alex      1000 alex      1000
pulseaudio        17406   17422 alex      1000 alex      1000
sshd              17403   17427 alex      1000 alex      1000
dbus-daemon       17406   17482 alex      1000 alex      1000
bash              17427   19104 alex      1000 alex      1000
ps                19104   19178 alex      1000 alex      1000

Вывод информации в виде дерева процессов

Утилита ps может вывести информацию в виде дерева процессов. Для этого нужно использовать опцию f. Но информация в виде дерева выводится только если в выводе присутствуют поля comm или cmd:

$ ps f -u alex -o pid,comm
    PID COMMAND
  17427 sshd
  19104  \_ bash
  19185      \_ ps
  17406 systemd
  17407  \_ (sd-pam)
  17422  \_ pulseaudio
  17482  \_ dbus-daemon

Комбинирование опций команды ps

Можно комбинировать все эти опции, например вывести в виде дерева процессы определенного пользователя:

$ ps f -u alex -o pid,user,comm
    PID USER     COMMAND
  17427 alex     sshd
  19104 alex      \_ bash
  19187 alex          \_ ps
  17406 alex     systemd
  17407 alex      \_ (sd-pam)
  17422 alex      \_ pulseaudio
  17482 alex      \_ dbus-daemon

Или вывести в виде дерева информацию по программе:

$ ps f -C postgres -o pid,user,cmd
    PID USER     CMD
    608 postgres /usr/lib/postgresql/16/bin/postgres
    690 postgres  \_ postgres: 16/main: checkpointer
    691 postgres  \_ postgres: 16/main: background writer
    736 postgres  \_ postgres: 16/main: walwriter
    737 postgres  \_ postgres: 16/main: autovacuum launcher
    739 postgres  \_ postgres: 16/main: logical replication launcher

Утилита ps и состояния процессов

Утилита ps может выводить состояния процессов:

  • D — беспробудный сон, ожидая ввод/вывод какого-нибудь устройства;
  • I — бездействующий поток ядра;
  • R — готов выполнятся или уже выполняется процессором;
  • S — сон, ожидает каких-нибудь ресурсов;
  • T — остановлен сигналом;
  • t — остановлен дебагом;
  • X — мертвый, никогда не должно быть видно;
  • Z — зомби, мертвый но не погребенный, то есть не успел освободить pid;
  • < — высокий приоритет;
  • N — низкий приоритет;
  • L — страницы процесса заблокированы в памяти;
  • s — лидер сессии;
  • l — многопоточный;
  • + — выполняется на переднем плане, то есть это не фоновый процесс.

Например, пробежимся по некоторым процессам:

$ ps -e -o user,pid,stat,comm
USER       PID STAT COMMAND               
root         1 Ss   systemd                      - является лидером сессии
root         8 I<   kworker/0:0H-events_highpri  - поток ядра, с высоким приоритетом 
root        45 SN   ksmd                         - с низким приоритетом
root        22 S<   crypto                       - с высоким приоритетом
root       264 Ss   systemd-journal              - является лидером сессии
systemd+   306 Ssl  systemd-timesyn              - является лидером сессии, многопоточный
root       279 Ssl  rsyslogd                     - является лидером сессии, многопоточный
alex     17406 Ss   systemd                      - является лидером сессии (это я подключен по ssh)
alex     17427 S    sshd                         - это мой процесс ssh
alex     19104 Ss   bash                         - это мой процесс bash
alex     19197 R+   ps                           - на переднем плане (я запустил ps)

Если тебе понравилась эта статья, подпишись на мой канал в VK.

Оставьте комментарий