ПРи загрузке операционной системы на базе Linux сначала запускается ядро. Ядро, в свою очередь, отвечает за запуск первого процесса, которым в современных дистрибутивах является процесс systemd. Этот процесс отвечает за все остальные процессы. При запуске процесса systemd запускает его как дочерний процесс. Запущенный дочерний процесс, в свою очередь, может запускать другие процессы. В итоге образуется дерево процессов.
Для просмотра дерева процессов можно использовать команду pstree:
eugene@Eugene:~$ pstree systemd─┬─ModemManager───3*[{ModemManager}] ├─NetworkManager───3*[{NetworkManager}] ├─accounts-daemon───3*[{accounts-daemon}] ├─apache2───5*[apache2] ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─boltd───3*[{boltd}] ├─colord───3*[{colord}] ├─cron ├─cups-browsed───3*[{cups-browsed}] ├─cupsd───dbus ├─dbus-daemon ├─fwupd───5*[{fwupd}] ├─gdm3─┬─gdm-session-wor─┬─gdm-wayland-ses─┬─gnome-session-b───3*[{gnom+ │ │ │ └─3*[{gdm-wayland-ses}] │ │ └─3*[{gdm-session-wor}] │ └─3*[{gdm3}] ├─irqbalance───{irqbalance} ├─2*[kerneloops]
Для мониторинга процессов в Linux предназначена команда ps. Эта команда принимает много опций, но обычно используются наборы опций aux
и -ef
. Например, для просмотра состояния всех процессов применяется команда ps aux:
eugene@Eugene:~$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 169800 12476 ? Ss 07:30 0:02 /sbin/init sp root 2 0.0 0.0 0 0 ? S 07:30 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 07:30 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 07:30 0:00 [rcu_par_gp] root 5 0.0 0.0 0 0 ? I< 07:30 0:00 [slub_flushwq root 6 0.0 0.0 0 0 ? I< 07:30 0:00 [netns] ...................................... root 19078 0.0 0.0 0 0 ? I 14:09 0:00 [kworker/6:0] eugene 19108 0.0 0.0 1186478064 65184 ? Sl 14:10 0:00 /opt/google/c root 19170 0.0 0.0 0 0 ? I 14:14 0:00 [kworker/u48: eugene 19276 100 0.0 14144 4992 pts/0 R+ 14:24 0:00 ps aux
Формально aux
состоит из трех опций: опция a обеспечивает отображение всех процессов, опция u предоставляет расширенную
информацию об использовании, а опция x показывает, с какого TTY и каким пользователем запускается процесс. Вкратце разберем выводимые столбцы:
USER: имя пользователя, запустившего процесс.
PID: PID - идентификатор процесса. Команда ps aux
сортирует процессы по их PID.
%CPU: процент процессорного времени, использованного процессом с момента запуска.
%MEM: процент памяти, используемый процессом в данный момент.
VSZ: общий объем памяти, затребованный этим процессом.
RSS: общий объем памяти, используемой процессом в данный момент.
TTY: терминал (TTY), с которого был запущен процесс. Знак вопроса указывает на процесс демона, который не связан ни с каким TTY.
STAT: текущее состояние процесса.
START: время запуска процесса.
TIME: общее количество системного времени, использованное этим процессом с момента его запуска.
COMMAND: команда, которая использовалась для запуска этого процесса. Если имя этой команды заключено в квадратные скобки, процесс запускается не командой в командной строке, а является потоком ядра.
Аналогичный вывод можно получить, использовав другую комбинацию опций - -ef
eugene@Eugene:~$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 09:26 ? 00:00:00 /sbin/init splash root 2 0 0 09:26 ? 00:00:00 [kthreadd] root 3 2 0 09:26 ? 00:00:00 [rcu_gp] root 4 2 0 09:26 ? 00:00:00 [rcu_par_gp] root 5 2 0 09:26 ? 00:00:00 [slub_flushwq] root 6 2 0 09:26 ? 00:00:00 [netns] root 7 2 0 09:26 ? 00:00:00 [kworker/0:0-rcu_par_gp] root 8 2 0 09:26 ? 00:00:00 [kworker/0:0H-events_highpri root 9 2 0 09:26 ? 00:00:00 [kworker/0:1-cgroup_destroy] root 10 2 0 09:26 ? 00:00:00 [kworker/u48:0-flush-259:0] root 11 2 0 09:26 ? 00:00:00 [mm_percpu_wq] .................................................................. eugene 4096 3806 0 09:29 ? 00:00:00 /snap/code/155/usr/share/cod eugene 4117 3806 3 09:29 ? 00:00:01 /snap/code/155/usr/share/cod eugene 4153 4117 2 09:29 ? 00:00:01 /snap/code/155/usr/share/cod eugene 4248 3601 50 09:30 pts/0 00:00:00 ps -ef eugene@Eugene:~$
Вначале идут столбцы пользователя (UID), который запустил процесс, и идентификатора процесса (PID). В отличие от предыдущий сводки команда также выводит столбец
PPID, который хранит идентификатор родительского процесса. Затем идет столбец C, который показывает
использование процессора этим процессом, что аналогично столбцу %CPU
в сводке команды ps aux
.
Сочетания эту команду с командами обработки текста, мы можем сделать некое подобие фильтрации. Например, получим все процессы, у которых команда содержит "gnome":
eugene@Eugene:~$ ps aux | grep gnome eugene 2520 0.0 0.0 298564 16320 tty2 Sl+ 09:27 0:00 /usr/libexec/gnome-session-binary --session=ubuntu eugene 2599 0.0 0.0 91492 5376 ? Ssl 09:27 0:00 /usr/libexec/gnome-session-ctl --monitor eugene 2645 5.7 0.5 6473112 337724 ? Ssl 09:27 6:17 /usr/bin/gnome-shell eugene 2800 0.0 0.0 235984 7296 ? Sl 09:27 0:00 /usr/libexec/at-spi2-registryd --use-gnome-session eugene 2819 0.0 0.0 655292 16320 ? Sl 09:27 0:00 /usr/libexec/gnome-shell-calendar-server eugene 3210 0.0 0.0 897828 40236 ? Ssl 09:27 0:00 /usr/libexec/xdg-desktop-portal-gnome eugene 3581 0.4 0.0 706412 59960 ? Ssl 09:28 0:31 /usr/libexec/gnome-terminal-server eugene 10800 0.0 0.0 9120 2112 pts/0 S+ 11:16 0:00 grep --color=auto gnome eugene@Eugene:~$
Аналогично, например, найдем все процессы, связанные с браузером Google Chrome:
ps aux | grep chrome