Управление процессами в Linux


Процесс — информационная структура в ядре. Каждый процесс содержит информацию о программе, которая будет выполняться, времени ее выполнения и т.д. Управление процессами в Linux может осуществляться администратором (основные приемы будут рассмотрены в рамках данного материала), сами процессы порождаются родительскими, первый из которых init.



Процессы всегда относятся к пользователям, то есть выполняются ядром, а не управляют им.
Процесс — тоже файлы, просмотреть их можно в корневой директории /proc

Управление процессами в linux


В Linux всё является файлами, в том числе процессы


Посмотреть можно следующим образом:

ls -lh /proc | grep -e [09] | more

Используется расширенный grep, выбирающий файлы, содержащие в названии цифры


ps

PID TTY          TIME CMD
7438 pts/4    00:00:00 bash
7452 pts/4    00:00:00 ps


Выдает идентификатор оболочки пользователя

cd /proc/7438


Смотрим файл exe

ls exe



Он является символьной ссылкой, с ключом -l видим, что выполняется программа /bin/bash

ls -l exe

lrwxrwxrwx 1 admin admin 0 мар  2 14:25 exe -> /bin/bash

more status



Смотрим статус процесса:

Name:    bash
State:    S (sleeping)



Процесс в статусе sleeping. Наблюдается это потому, что при вводе more процесс bash разделился (forked), создалась копия, more была передана информация о том, что процесс выполняемый; к новому процессу подключились STD IN, STD OUT, STD ERR. И основной процесс (поскольку ему не была передана команда на продолжение) перешел в состояние sleeping.


Процесс ждет возврата more, как только more возвращается — передается сигнал _exit (ядро таким образом узнает о том, что процесс завершен). Родительский процесс при этом подхватит _exit  статус more, more погибнет.


Если bash сессия завершается more остается orphan-процессом, но вскоре подхватывается init, upstart или systemd. Один из этих процессов дожидается _exit статуса more.



Идентификаторы процессов в Linux


PID идентификатор процесса
UID владелец процесса
EUID эффективный идентификатор пользователя  (когда программа имеет SUID бит EUID не совпадает с PID)
GID идентификатор группы
EGID эффективный идентификатор группы
PPID идентификатор родительского процесса рассматриваемого процесса

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




Возможные статусы процессов:
Runnable
Sleeping
Stoped
Zombie

Zombie процесс — завершившийся процесс, _exit статус которого не был принят никаким родительским процессом. Zombie процессы в современном Linux встречаются крайне редко.



Процессы могут иметь определенное значение Nice — приоритет при выполнении по сравнению с другими процессами. -19 — максимальный приоритет, 20 — минимальный. Приоритет можно поменять используя renice.



Потоки (Threads) — части программы, которые могут выполняться совместно в рамках одного процесса. Один из потоков может контролировать определенный параметр и передавать его значение другому потоку.



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

ps -eL | more



В выводе можно заметить процессы с одинаковыми идентификаторами, это и есть потоки. Они выполняются в рамках одного процесса и имеют также свои внутренние идентификаторы (колонка LP — light weight proccess).

Операции с потоками выполняются, как правило, на уровне процессов.



Управление процессами в linux — команды администратора


ps

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

Одна из самых распространенных комбинаций флагов:

ps aux



Выводятся все процессы, выполняющиеся от имени всех пользователей (выводит статистику, время старта процесса и команду, которая его стартовала)

ps -e

Все выполняющиеся процессы в системе



Обычно вывод списка процессов передается через | в grep (если производится поиск определенного процесса),  в more или less (если необходим вывод всего списка)

ps aux | grep firefox



Одна из следующих команд выводит дерево процессов (что позволяет увидеть порождение процесса и родительский процесс)

ps fax

ps tree


С grep подобная комбинация работает плохо, поэтому оптимальным является перенаправление вывода в файл и поиск в nano, mcedit или любом другом текстовом редакторе

ps fax > testfile.txt



Сигналы, которые могут передаваться процессам

Перечисленные сигналы являются самыми широко используемыми

1 GIGHUP — замечено прерывание процесса, сигнал на перезапуск (раньше при помощи этого сигнала перезапускались демоны)
2 SUGINT  — прерывание, подобный сигнал передается при нажатии комбинации CTRL+C
3 SUGQUIT — преырывние процесса при возможности с создание coredump
9 SIGKILL — завершение процесса ядром (моментальное с возможной потерей данных)
15 SIGTERM — «мягкое» завершение процесса (с сохранением временных данных при возможности)



Практически применяются SUGINT при нажатии CTRL+C, SIGTERM (kill -15 PID / kill -TERM PID) и SIGKILL (kill -9 PID). Последняя команда является самой опасной и используется при необходимости мгновенно завершить процесс. Управление процессами в Linux на практике в большинстве случаев сводится в использованию ps и kill.


Читайте также про то, как запускать процессы в фоновом режиме — это очень полезно при выполнении длительных операций.

Сказать спасибо