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