- Sysadminium
- Утилита ps
- Просмотр общего списка процессов
- Просмотр информации о конкретных процессах
- Получение определённой информации
- Вывод информации в виде дерева процессов
- Комбинирование опций команды ps
- Утилита ps и состояния процессов
- Итог
- Работа с процессами в Linux
- Список процессов
- Ключи
- Примеры
- Убить процесс
- Подробная информация о процессе
- Потребление ресурсов процессами
Sysadminium
Здесь будет рассмотрена утилита 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 — информация по конкретному процессу;
- -u — процессы пользователя;
- -g — процессы группы;
- -C — процессы приложения;
- L — доступные поля для формирования настраиваемого вывода;
- -o — выбираем что выводить в настраиваемом выводе;
- f — вывод в виде дерева;
А ещё я показал как обозначаются различные состояний процессов в выводе ps.
Источник
Работа с процессами в Linux
Обновлено: 29.03.2023 Опубликовано: 09.11.2017
Список процессов
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 661 0.0 0.0 4072 8 tty1 Ss+ Jul03 0:00 /sbin/mingetty
root 662 0.0 0.0 4072 8 tty2 Ss+ Jul03 0:00 /sbin/mingetty
root 16355 0.0 0.0 171636 3308 pts/0 S 15:46 0:00 sudo su
root 16366 0.0 0.0 140896 1556 pts/0 S 15:46 0:00 su
root 16368 0.0 0.0 108316 1944 pts/0 S 15:46 0:00 bash
root 18830 0.0 0.0 110244 1172 pts/0 R+ 16:20 0:00 ps u
- USER — учетная запись пользователя, от которой запущен процесс.
- PID — идентификатор процесса.
- %CPU — потребление процессорного времени в процентном эквиваленте.
- %MEM — использование памяти в процентах.
- VSZ — Virtual Set Size. Виртуальный размер процесса (в килобайтах).
- RSS — Resident Set Size. Размер резидентного набора (количество 1K-страниц в памяти).
- TTY — терминал, из под которого был запущен процесс.
- STAT — текущее состояние процесса. Могут принимать значения:
- R — выполнимый процесс;
- S — спящий;
- D — в состоянии подкачки на диске;
- T — остановлен;
- Z — зомби.
- W — не имеет резидентных страниц;
- < —высоко-приоритетный;
- N — низко-приоритетный;
- L — имеет страницы, заблокированные в памяти.
- START — дата запуска процесса.
- TIME — время запуска процесса.
- COMMAND — команда, запустившая процесс.
Ключи
Ключ | Описание |
---|---|
-A | Все процессы. |
-a | Запущенные в текущем терминале, кроме главных системных. |
-d | Все, кроме главных системных процессов сеанса. |
-e | Все процессы. |
f | Показать дерево процессов с родителями. |
T | Все на конкретном терминале. |
a | Все, связанные с текущим терминалом и терминалами других пользователей. |
r | Список только работающих процессов. |
x | Отсоединённые от терминала. |
u | Показать пользователей, запустивших процесс. |
Примеры
Поиск процесса с помощью grep:
Убить процесс
Останавливаем процесс по его PID:
Если процесс не завершается, убиваем его принудительно:
Остановить все процессы с именем nginx:
Как и в случае с kill, можно это сделать принудительно:
Можно остановить все процессы конкретного пользователя:
Ищем процесс по имени, извлекаем его PID и завершаем его:
kill `ps aux | grep 'apache' | awk ''`
* обратите внимание, что запрос может вывести несколько процессов, которые будут попадать под критерии поиска — в таком случае, они будут завершены все.
Подробная информация о процессе
Для каждого процесса создается каталог по пути /proc/ , в котором создаются папки и файлы с описанием процесса.
Примеры использования /proc/
Адрес в ячейках оперативной памяти, которые занял процесс:
Команда, которой был запущен процесс:
Символьная ссылка на рабочий каталог процесса:
Символьная ссылка на исполняемый файл, запустивший процесс:
Увидеть ссылки на дескрипторы открытых файлов, которые затрагивает процесс:
Подробное описание на сайте man7.org.
Потребление ресурсов процессами
Для просмотра статистики потребления ресурсов используем утилиту top:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21059 root 20 0 157884 2280 1496 R 18,8 0,1 0:00.03 top
1 root 20 0 190996 2964 1652 S 0,0 0,1 6:49.99 systemd
2 root 20 0 0 0 0 S 0,0 0,0 0:01.78 kthreadd
3 root 20 0 0 0 0 S 0,0 0,0 0:24.75 ksoftirqd/0
5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H
- PID — идентификатор процесса.
- USER — имя учетной записи, от которой запущен процесс.
- PR — приоритет процесса.
- NI — приоритет, выставленной командой nice.
- VIRT — объем виртуальной памяти, потребляемый процессом.
- RES — объем используемой оперативной памяти.
- SHR — количество разделяемой памяти, которое используется процессом.
- S — состояние процесса.
- %CPU — процент использования процессорного времени.
- %MEM — потребление оперативной памяти в процентах.
- TIME — использование процессорного времени в секундах.
- COMMAND — команда, которая запустила процесс.
Источник