процессы_в_linux

Процессы в Linux

Немного о жизненном пути, который проходят процессы в семействе ОС Linux. Как они рождаются и умирают. Системное программное обеспечение взаимодействует с ядром системы посредством специальных функций — системных вызовов. Процесс в ядре представляется просто как структура с множеством полей. Наиболее значимые для администратора поля:

  • Идентификатор процесса (pid)
  • Открытые файловые дескрипторы (fd)
  • Обработчики сигналов (signal handler)
  • Текущий рабочий каталог (cwd)
  • Переменные окружения (environ)
  • Код возврата

Только один процесс в системе рождается особенным способом — init — он порождается непосредственно ядром.Все остальные процессы появляются путём дублирования текущего процесса с помощью системного вызова fork(2). После выполнения fork(2) получаем два практически идентичных процесса за исключением следующих пунктов:

  1. fork(2) возвращает родителю PID ребёнка, ребёнку возвращается 0;
  2. У ребёнка меняется PPID (Parent Process Id) на PID родителя.

Работа с процессами на примере команды - sleep. Это команда, устанавливает задержку на определенное время. Запускаем команду с задержкой 500 секунд. Знак & говорит о том, что процесс будет запущен в фоновом режиме.

sleep 500 &
[1] 2362

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

nohup sleep 500 &
[1] 3445
nohup: ignoring input and appending output to 'nohup.out'

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

 jobs
[1]   Running                 sleep 500 &

Для взаимодействия с запущенными процессами используется команда fg (foreground) и номер процесса из jobs

fg 1

для остановка процесса используется сочетание клавиш Ctrl + z.

[1]+  Stopped                 sleep 500

Чтобы заново запустить процесс используем команду bg (background) и номер процесса из jobs

bg 1
[1]+ sleep 500 &

Если процесс удачно завершился, мы увидим вот такой симпатичный статус

 jobs
[1]+  Done                    sleep 500

Посмотреть текущее состояние процессов, можно с помощью такой программы как ps (process sbapshot). Наиболее часто использующиеся ключи

a - все процессы 
u - userlist
x - процессы, отсоединённые от терминала
ps aux | grep sleep
root      3373  0.0  0.0   5828   696 pts/0    S    14:12   0:00 sleep 500
root      3377  0.0  0.0  12776   928 pts/0    S+   14:12   0:00 grep sleep

Завершает (убиваем процесс) по его PID

 kill 3373
# завершает все процессы с именем sleep
killall sleep

Для удобства просмотра можно отсортировать вывод программы по нужной колонке, например, просмотр процессов, которые используют больше всего памяти:

ps -Fe --sort rss

Или по проценту загрузки cpu:

ps -FA --sort pcpu

Общее количество запущенных процессов Linux можно узнать командой:

ps -e | wc

Для того чтобы отобразить потребление процессора не в байтах, а в мегабайтах, используется вот такая конструкция

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Эта команда берет результат ps, а затем для каждой строки, кроме первой, заменяет 5-й столбец, который обычно находится в КБ, на МБ с добавлением суффикса M.

Выдаст топ-5 процессов по использованию памяти:

ps -eo pmem,pcpu,vsize,pid,cmd | sort -k 1 -nr | head -5

Команда pstree показывает иерархически все процессы

 pstree
systemd─┬─2*[agetty]
        ├─cron
        ├─dbus-daemon
       ...
        ├─systemd───(sd-pam)
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-timesyn───{sd-resolve}
        └─systemd-udevd

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

pgrep sleep -l
13344 sleep

Посмотреть на процессы запущенные под конкретным пользователем

pgrep -u johndoe  -l

Значение столбцов top:

значение описание
PID Это идентификатор процесса, уникальное положительное целое число, которое идентифицирует процесс.
USER Это имя пользователя, который запустил этот процесс.
PR Поле показывает приоритет выполнения процесса с точки зрения ядра.
NI Поле показывает nice-значение процесса.
VIRT Общий объем памяти, потребляемый процессом.Он включает в себя код программы, данные, хранящиеся в памяти, а также любые области памяти, которые были подкачены на диск.
RES Количество памяти, потребляемая процессом в оперативной памяти.
SHR Объем памяти, совместно используемый другими процессами.
S В этом поле отображается состояние процесса в однобуквенной форме(R - Runnable, D - Interruptible sleep, S - Uninterruptible sleep, T - Stopped, Z - Zombie).
%CPU Параметр выражает объем в процентах от общей доступной оперативной памяти ОЗУ.
%MEM Параметр выражает значение RES в процентах от общей доступной оперативной памяти.
TIME+ Общее время процессора, используемое процессом с момента его начала, с точностью до сотых долей секунды.
COMMAND Здесь отображено название процессов.

Сортировка списка процессов

  • M - для сортировки по памяти;
  • P - для сортировки по использованию CPU;
  • N - для сортировки по идентификатору процесса;
  • T - сортировать по времени работы.

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

Для завершения процесса нажимаем k, и указываем PID. Для завершения процесса посылается сигнал 15, и процесс программно завершается. Для жесткого завершения процесса, посылается сигнал 9, который завершит процесс игнорируя зависящие процессы.

Баттоны t и m, изменяют стиль отображения статистики процессора и памяти.

Список наиболее часто используемых сигналов:

имя описание
1 HUP Hangup. Отбой
2 INT Interrupt. В случае выполнения простых команд вызывает прекращение выполнения
3 QUIT Как правило, сильнее сигнала Interrupt
4 ILL Illegal Instruction. Центральный процессор столкнулся с незнакомой командой (в большинстве случаев это означает, что допущена программная ошибка) Сигнал отправляется программе, в которой возникла проблема
8 FPE Floating Point Exception. Вычислительная ошибка, например, деление на ноль
9 KILL Всегда прекращает выполнение процесса
11 SEGV Segmentation Violation. Доступ к недозволенной области памяти
13 PIPE Была предпринята попытка передачи данных с помощью конвейера или очереди FIFO, однако не существует процесса, способного принять эти данные
15 TERM Software Termination. Требование закончить процесс (программное завершение)
17 CHLD Изменение статуса порожденного процесса
18 CONT Продолжение выполнения приостановленного процесса
19 STOP Приостановка выполнения процесса
20 TSTP Сигнал остановки , генерируемый клавиатурой. Переводит процесс в фоновый режим

uptime — утилита показывающая текущее время, время работы после загрузки, и нагрузку за последние 1, 5 и 15 минут. Уровень загрузки отображается в виде так называемого LA — числа процессов, ожидающих своей очереди на выполнение

uptime
15:01:14 up 12 days, 23:11,  1 user,  load average: 0.67, 0.32, 0.13

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

w
 15:07:53 up 12 days, 23:17,  1 user,  load average: 0.00, 0.08, 0.07
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
imeryk   pts/0    10.10.10.14    Mon13    1.00s  2.05s  1.11s sshd: imeryk [priv]
  • процессы_в_linux.txt
  • Последнее изменение: 2022/11/02 10:02
  • admin