Здесь будет рассмотрена утилита 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.