🐧 Понимание процессов Linux с нуля

Мануал

Процесс создается в памяти при запуске программы или команды.

Ему присваивается уникальный идентификационный номер, известный как идентификатор процесса (PID), который используется ядром для управления процессом до завершения программы или команды, с которой он связан.

Например, когда пользователь входит в систему, запускается оболочка (которая является процессом).

🐧 Базовое руководство по процессу загрузки Linux

Аналогично, когда пользователь выполняет команду или открывает приложение, создается процесс.

Таким образом, процесс – это любая программа, приложение или команда, которая выполняется в системе.

При загрузке системы порождается несколько процессов, многие из которых сидят в памяти и ждут события, которое вызовет запрос на использование их сервиса.

Эти фоновые системные процессы называются демонами и являются критическими для функциональности системы.

Просмотр процессов

Для просмотра текущих запущенных процессов обычно используются две команды.

Это ps (process status) и top.

Команда 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
................................................

Состояния процесса

После того как процесс порожден, он не работает непрерывно.

Он может некоторое время находиться в нерабочем состоянии или ждать, пока какой-либо другой процесс передаст ему информацию, чтобы он мог продолжить работу.

Существует пять состояний процесса, и каждый процесс в любой момент времени находится в одном из них.

Эти состояния – runningsleepingwaitingstopped и 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 Отображает имя файла или имя файловой системы, в которой находится файл.
Добавить комментарий