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

Утилита ps

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

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

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

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

alex@deb-11:~$ ps
    PID TTY          TIME CMD
   3621 pts/0    00:00:00 bash
  20010 pts/0    00:00:00 ps

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

alex@deb-11:~$ ps ax | head
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:04 /lib/systemd/systemd --system --deserialize 33
      2 ?        S      0:00 [kthreadd]
      3 ?        I<     0:00 [rcu_gp]
      4 ?        I<     0:00 [rcu_par_gp]
      6 ?        I<     0:00 [kworker/0:0H-events_highpri]
      8 ?        I<     0:00 [kworker/0:1H-events_highpri]
      9 ?        I<     0:00 [mm_percpu_wq]
     10 ?        S      0:00 [rcu_tasks_rude_]
     11 ?        S      0:00 [rcu_tasks_trace]

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

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

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

alex@deb-11:~$ ps -e | head
    PID TTY          TIME CMD
      1 ?        00:00:04 systemd
      2 ?        00:00:00 kthreadd
      3 ?        00:00:00 rcu_gp
      4 ?        00:00:00 rcu_par_gp
      6 ?        00:00:00 kworker/0:0H-events_highpri
      8 ?        00:00:00 kworker/0:1H-events_highpri
      9 ?        00:00:00 mm_percpu_wq
     10 ?        00:00:00 rcu_tasks_rude_
     11 ?        00:00:00 rcu_tasks_trace

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

alex@deb-11:~$ ps -e u | head
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  1.0 164824 10184 ?        Ss   сен09   0:04 /lib/systemd/systemd --system --deserialize 33
root           2  0.0  0.0      0     0 ?        S    сен09   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   сен09   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   сен09   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   сен09   0:00 [kworker/0:0H-events_highpri]
root           8  0.0  0.0      0     0 ?        I<   сен09   0:00 [kworker/0:1H-events_highpri]
root           9  0.0  0.0      0     0 ?        I<   сен09   0:00 [mm_percpu_wq]
root          10  0.0  0.0      0     0 ?        S    сен09   0:00 [rcu_tasks_rude_]
root          11  0.0  0.0      0     0 ?        S    сен09   0:00 [rcu_tasks_trace]

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

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

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

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

alex@deb-11:~$ ps u -p 1
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  1.0 164824 10184 ?        Ss   сен09   0:04 /lib/systemd/systemd --system --deserialize 33

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

alex@deb-11:~$ ps u -p 1,2
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  1.0 164824 10184 ?        Ss   сен09   0:04 /lib/systemd/systemd --system --deserialize 33
root           2  0.0  0.0      0     0 ?        S    сен09   0:00 [kthreadd]

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

alex@deb-11:~$ ps u -u www-data
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data   19634  0.0  1.3 1216100 13092 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   19635  0.0  0.6 1216100 6972 ?        Sl   00:00   0:00 /usr/sbin/apache2 -k start

alex@deb-11:~$ id www-data
uid=33(www-data) gid=33(www-data) группы=33(www-data)

alex@deb-11:~$ ps u -u 33
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data   19634  0.0  1.3 1216100 13092 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   19635  0.0  0.6 1216100 6972 ?        Sl   00:00   0:00 /usr/sbin/apache2 -k start

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

alex@deb-11:~$ ps u -g www-data
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data   19634  0.0  1.3 1216100 13092 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   19635  0.0  0.6 1216100 6972 ?        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        3753  0.0  0.7  11228  7984 ?        Ss   сен12   0:15 /usr/sbin/apache2 -k start
www-data   19634  0.0  1.3 1216100 13092 ?       Sl   00:00   0:00 /usr/sbin/apache2 -k start
www-data   19635  0.0  0.6 1216100 6972 ?        Sl   00:00   0:00 /usr/sbin/apache2 -k start

Как видно apache2 работает не только от пользователя www-data, один из процессов запущен от root. Это мастер-процесс, который запускает все остальные процессы apache2. Только root процессы могут прослушивать порты с номерами ниже 1024. Веб-сервер обычно работает на порту 80 или 443. Это означает, что он должен запускаться с правами root.

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

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

alex@deb-11:~$ ps L | tail
user         USER
userns       USERNS
util         C
utsns        UTSNS
uunit        UUNIT
vsize        VSZ
vsz          VSZ
wchan        WCHAN
wname        WCHAN
zone         ZONE

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

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

alex@deb-11:~$ ps -o comm,cmd
COMMAND         CMD
bash            -bash
ps              ps -o comm,cmd

Выведем информацию по памяти:

alex@deb-11:~$ ps -o comm,%mem,rss,vsz
COMMAND         %MEM   RSS    VSZ
bash             0.7  7192  10328
ps               0.1  1144   9684

Или информацию по процессору:

alex@deb-11:~$ ps -o comm,%cpu,cputime,cpuid
COMMAND         %CPU     TIME CPUID
bash             0.0 00:00:00     1
ps               0.0 00:00:00     0

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

alex@deb-11:~$ ps -o comm,ppid,pid,user,uid,group,gid
COMMAND            PPID     PID USER       UID GROUP      GID
bash               3620    3621 alex      1000 alex      1000
ps                 3621   20046 alex      1000 alex      1000

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

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

alex@deb-11:~$ ps f -o pid,user,comm,cmd
    PID USER     COMMAND         CMD
   3621 alex     bash            -bash
  20047 alex      \_ ps           \_ ps f -o pid,user,comm,cmd

Или:

alex@deb-11:~$ ps f
    PID TTY      STAT   TIME COMMAND
   3621 pts/0    Ss     0:00 -bash
  20048 pts/0    R+     0:00  \_ ps f

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

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

alex@deb-11:~$ ps -u alex f -o pid,user,comm
    PID USER     COMMAND
   3620 alex     sshd
   3621 alex      \_ bash
  20049 alex          \_ ps
   3609 alex     systemd
   3610 alex      \_ (sd-pam)

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

alex@deb-11:~$ ps -C apache2 f -o pid,user,comm
    PID USER     COMMAND
   3753 root     apache2
  19634 www-data  \_ apache2
  19635 www-data  \_ apache2

Выше наглядно видно что процесс apache2 запущенный от пользователя root запускает рабочие процессы от пользователя www-data.

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

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

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

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

alex@deb-11:~$ ps -e -o user,pid,stat,comm
USER       PID STAT COMMAND               
root         1 Ss   systemd            - является лидером сессии
root         2 S    kthreadd
root         5 S<   kworker/0:0H       - работает с высоким приоритетом 
***
root        18 S    kcompactd0
root        19 SN   ksmd               - работает с низким приоритетом
root        22 S<   crypto
***
root       159 Ss   systemd-journal    - является лидером своей сессии
root       168 S    kauditd
root       184 Ss   systemd-udevd      - является лидером своей сессии
root       210 S<   edac-poller
root       279 Ssl  rsyslogd           - является лидером сессии и многопоточный
***
alex       696 Ss   systemd            - лидер сессии (это я подключился по ssh)
alex       698 S    (sd-pam)
alex       708 R    sshd               - процесс выполняется (я работаю по ssh)
alex       713 Ss   bash
***
root      2608 R+   ps                 - на переднем плане (я запустил ps)

Итог

Мы познакомились с командой ps которой удобно исследователь процессы.

Изучили следующие опции ps:

  • a — все процессы с управляющим терминалом;
  • x — все процессы без управляющего терминала;
  • -e — все процессы;
  • u — больше информации;
  • -p <pid> — информация по конкретному процессу;
  • -u <пользователь или uid> — процессы пользователя;
  • -g <группа или gid> — процессы группы;
  • -C <приложение> — процессы приложения;
  • L — доступные поля для формирования настраиваемого вывода;
  • -o — выбираем что выводить в настраиваемом выводе;
  • f — вывод в виде дерева;

А ещё я показал как обозначаются различные состояний процессов в выводе ps.


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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *