Процесс создается в памяти при запуске программы или команды.
Ему присваивается уникальный идентификационный номер, известный как идентификатор процесса (PID), который используется ядром для управления процессом до завершения программы или команды, с которой он связан.
Например, когда пользователь входит в систему, запускается оболочка (которая является процессом).
🐧 Базовое руководство по процессу загрузки Linux
Аналогично, когда пользователь выполняет команду или открывает приложение, создается процесс.
Таким образом, процесс – это любая программа, приложение или команда, которая выполняется в системе.
При загрузке системы порождается несколько процессов, многие из которых сидят в памяти и ждут события, которое вызовет запрос на использование их сервиса.
Эти фоновые системные процессы называются демонами и являются критическими для функциональности системы.
Просмотр процессов
Для просмотра текущих запущенных процессов обычно используются две команды.
Это ps (process status) и top.
- Как сохранить вывод команды Top в файл
- 🔍 Установка Bashtop – мониторинг ресурсов из терминала для Linux | macOS | FreeBSD
- gotop – инструмент для мониторинга активности системы в Linux
- Gtop – панель мониторинга системы Linux для терминала
Команда ps без каких-либо опций или аргументов выводит список процессов, характерных для терминала, на котором запущена эта команда:
$ ps PID TTY TIME CMD 17655 pts/0 00:00:00 bash 17703 pts/0 00:00:00 ps
Вывод имеет четыре колонки, в которых отображается PID процесса в первой колонке, терминал, к которому принадлежит процесс, во второй колонке, суммарное время выполнения процесса системным процессором в третьей колонке и имя фактической выполняемой команды или программы в последней колонке.
Две опции -e (every) и -f (full) часто используются для получения подробной информации о каждом процессе, запущенном в системе.
Существует ряд дополнительных опций, доступных в команде ps.
Подробную информацию можно найти на страницах руководства.
$ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Feb04 ? 00:00:03 /sbin/init root 2 0 0 Feb04 ? 00:00:00 [kthreadd] root 3 2 0 Feb04 ? 00:00:01 [ksoftirqd/0] root 5 2 0 Feb04 ? 00:00:00 [kworker/0:0H] root 7 2 0 Feb04 ? 00:00:21 [rcu_sched] root 8 2 0 Feb04 ? 00:00:16 [rcuos/0] .....................
Вывод показывает более подробную информацию о запущенных процессах.
В таблице ниже описан тип содержимого каждого столбца.
Заголовок | Описание |
---|---|
UID | Идентификатор пользователя владельца процесса. |
PID | Идентификатор процесса. |
PPID | Идентификатор продительского процесса. |
C | Приоритет процесса. |
STIME | Время старта процесса. |
TTY | Терминал, на котором был запущен процесс. Console представляет системную консоль, а ? указывает на то, что процесс является демоном. |
TIME | Общее время выполнения процесса. |
CMD | Имя команды или программы. |
Обратите внимание, что в приведенном выше выводе ps есть десятки процессов демонов, запущенных в фоновом режиме, которые не связаны ни с какими терминалами.
Также обратите внимание на номера PID и PPID.
Чем меньше номер процесса, тем раньше он запускается.
Процесс с PID 0 запускается первым при загрузке системы, за ним следует процесс с PID 1, и так далее.
Каждый PID имеет соответствующий PPID в третьем столбце.
Владелец каждого процесса также отображается вместе с именем команды или программы.
Информация о каждом запущенном процессе хранится и поддерживается в таблице процессов, которую ps и другие команды считывают для отображения информации.
Второй способ просмотра информации о процессе – это команда top, которая также отображает загрузку процессора, памяти и свопа.
Ниже показан пример вывода данных из запущенной сессии top:
$ top
Нажмите q или Ctrl+c, чтобы выйти из top.
Помимо команды top, существуют и другие утилиты командной строки, такие как htop и atop, которые также можно использовать для просмотра информации о процессах, использовании памяти и процессора.
$ htop
$ atop
Вывод списка определенного процесса
Команду pidof можно использовать для перечисления PID определенного процесса, если вы знаете его имя.
🐧 Fkill – интерактивный поиск и уничтожение процессов в Linux
Например, чтобы перечислить PID демона crond, выполните команду следующим образом:
$ pidof cron 1209
Определение процессов по владению
Процессы можно перечислить по их владению или принадлежности к группе.
Для этого используется команда pgrep.
🚿 Как захватить столбец из вывода команды и преобразовать его в строку
📂 Как найти текущий рабочий каталог процесса, используя Pwdx на Linux
🚰 5 полезных инструментов для обнаружения утечек памяти с примерами
Например, чтобы перечислить все процессы, принадлежащие root, используйте любую из следующих команд:
# ps -U root # pgrep -U root
Первая команда перечисляет PID, TTY, Time и имя процесса для всех запущенных процессов, принадлежащих пользователю root, в то время как команда pgrep перечисляет только PID.
С опцией -G обе команды перечисляют все процессы, принадлежащие указанной группе.
Пример: Вывести список всех процессов, принадлежащих пользователю itsecforu
$ ps -U itsecforu PID TTY TIME CMD 2770 ? 00:00:00 gnome-keyring-d 2772 ? 00:00:00 init 2857 ? 00:00:00 ssh-agent 2862 ? 00:00:03 dbus-daemon 2870 ? 00:00:00 upstart-event-b 2875 ? 00:00:00 window-stack-br 2885 ? 00:00:00 upstart-file-br 2887 ? 00:00:01 upstart-dbus-br ................................................
Состояния процесса
После того как процесс порожден, он не работает непрерывно.
Он может некоторое время находиться в нерабочем состоянии или ждать, пока какой-либо другой процесс передаст ему информацию, чтобы он мог продолжить работу.
Существует пять состояний процесса, и каждый процесс в любой момент времени находится в одном из них.
Эти состояния – running, sleeping, waiting, stopped и zobmie– объясняются ниже:
- Running определяет, что процесс в данный момент выполняется системным процессором.
- Sleeping состояние показывает, что процесс в настоящее время ожидает ввода от пользователя или другого процесса.
- Waiting означает, что процесс получил входные данные, которых он ждал, и теперь он готов к выполнению, как только придет его очередь.
- Stopped означает, что процесс остановлен и не будет выполняться, даже когда придет его очередь, если ему не будет послан сигнал.
- Состояние zombie означает, что процесс мертв. Зомби-процесс существует в таблице процессов так же, как и любая другая запись процесса, но не занимает никаких ресурсов. Запись для зомби-процесса сохраняется до тех пор, пока родительский процесс не разрешит ему умереть. Зомби-процесс также называют неработающим процессом.
Приоритет процесса и как его установить
Приоритет процесса (niceness) определяется с помощью значения nice.
Система присваивает значение nice процессу при инициации, чтобы установить приоритет.
Существует 40 значений nice, из которых -20 – самое высокое, а +19 – самое низкое.
Большинство запущенных системных процессов используют значение nice по умолчанию 0.
Дочерний процесс наследует значение nice своего родительского процесса.
Используйте команду ps и укажите опцию -l, чтобы определить niceness запущенных процессов.
$ ps -efl F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S root 1 0 0 80 0 - 8536 poll_s Feb15 ? 00:00:02 /sbin/init 1 S root 2 0 0 80 0 - 0 kthrea Feb15 ? 00:00:00 [kthreadd] 1 S root 3 2 0 80 0 - 0 smpboo Feb15 ? 00:00:03 [ksoftirqd/0] 1 S root 5 2 0 60 -20 - 0 worker Feb15 ? 00:00:00 [kworker/0:0H] 1 S root 7 2 0 80 0 - 0 rcu_gp Feb15 ? 00:00:07 [rcu_sched] 1 S root 8 2 0 80 0 - 0 rcu_no Feb15 ? 00:00:12 [rcuos/0] 1 S root 9 2 0 80 0 - 0 rcu_no Feb15 ? 00:00:03 [rcuos/1] 1 S root 10 2 0 80 0 - 0 rcu_no Feb15 ? 00:00:04 [rcuos/2] ......................................................
Чтобы определить niceness по умолчанию, используйте команду nice без каких-либо опций или аргументов:
$ nice 0
При запуске программы или команды ей может быть присвоен другой приоритет.
Например, для запуска команды top с более низким приоритетом +2:
$ nice -2 top
Используйте команду ps с опцией -l или просмотрите вывод команды top и проверьте приоритет процесса.
Она должен быть равен +2.
Чтобы запустить ту же программу на более высоком приоритете с niceness -2, укажите значение через тире:
# nice --2 top
Проверьте новое значение с помощью команды ps или просмотрите вывод команды top.
Оно должно быть равно -2.
Перечисление открытых файлов
Файл открывается, когда выполняется процесс или программа, хранящаяся в нем, и закрывается, когда он больше не нужен или связанный с ним процесс или программа завершились.
Для определения информации о том, какие файлы открыты, какие процессы их используют и кто их владельцы, используется команда lsof (list open files).
Без каких-либо опций эта команда выводит список всех открытых файлов.
# lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root rtd DIR 8,1 4096 2 / init 1 root txt REG 8,1 265848 3801191 /sbin/init .................................................................
Команда создала девять колонок в выходных данных; они перечислены и объяснены в таблице ниже:
Столбец | Описание |
---|---|
COMMAND | Отображает первые девять символов имени команды или процесса. |
PID | Отображает PID процесса. |
USER | Отображает владельца процесса. |
FD | Отображает дескриптор файла. Некоторые значения в этом поле могут быть следующими: |
FD | cwd = текущий рабочий каталог; rtd = корневой каталог; |
FD | txt = текстовый файл; mem = файл с привязкой к памяти; pd = родительский каталог |
TYPE | Отображает тип файла. |
DEVICE | Отображает главный и младший номера устройства, на котором находится файл |
SIZE | Отображает размер файла |
NODE | Отображает номер inode файла. |
NAME | Отображает имя файла или имя файловой системы, в которой находится файл. |