Процессы Linux. Управление процессами. Часть 2: Администрирование

Привет, друг! Продолжаем вникать в основы Linux в целом и в процессы Linux в частности. Хотя, где та самая грань между основами и не основами мне не очень понятно. Но если ты решил изучать Linux, то знать или хотя бы ориентироваться в этих вопросах точно стоит. В прошлой части мы разобрались что такое процессы, какие у них есть идентификаторы и как те самые процессы находить. Если ты, вдруг, пропустил эту часть, то, перед тем ка читать дальше, стоит ознакомится: ЗДЕСЬ

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

Как запускаются и завершаются процессы Linux

Начнём с самого начала т.е. с запуска системы. При загрузке системы, ядро самостоятельно запускает некоторые процессы. Ключевой процесс это демон systemd (но, не забывай что в некоторых дистрибутивах это init), его PID всегда 1. Все остальные процессы (кроме созданных ядром) это его потомки. Чтобы появился новый процесс существующий клонирует себя с помощь системного вызова fork. Клон отличается от родителя только тем что имеет собственный PID и для него отдельно ведется учёт потребляемых ресурсов. После того как fork отработал, дочерний процесс, с помощью системного вызова exec запускает новую программу.

Чтобы процесс завершился, он должен вызвать функцию exit, для того чтобы уведомить ядро о готовности прекратить работу. Функция exit передаёт код завершения, это число означающее причину прекращения процесса. Если это число ноль — значит процесс завершился успешно. Но прежде чем процесс будет полностью завершен, его завершение должно быть подтверждено родительским процессом. Он это делает с использованием системного вызова wait. Но если вдруг родительский процесс завершается раньше потомков, то они будут переназначены демону systemd, и он станет для них родительским.

Сигналы

Чтобы понимать как процессы, условно говоря, общаются, нужно знать что существуют сигналы. По своей сути сигналы это способ коммуникации. Сигналы могут посылать как сами процессы, так и ядро, так и пользователь тоже может посылать сигналы. В большинстве случаев, когда поступает сигнал, ядро выполняет действие советующее этому сигналу.

Сигналов есть довольно много. Вникать во все, и уж тем более запоминать их, я не вижу какой-то лютой необходимости и это уж точно выходит за моё понимание «основ». Потому в этой статье мы рассмотрим только несколько примеров необходимых для понимания как вся эта кухня работает.

Чтобы просто увидеть список сигналов можно ввести команду:

kill -l
Процессы Linux

Понятней конечно не станет, но умный вид сделать можно.

Наиболее актуальные сигналы можно посмотреть в таблице ниже:

Процессы Linux

Принудительное завершение процессов

В большинстве случаев, когда ты захочешь принудительно завершить какой-то процесс, ты будешь пользоваться командой kill. Тут то тебе и понадобится знание некоторых сигналов. Логика использования очень простая: сначала вводишь kill, потом номер сигнала, потом PID процесса который нужно «убить».

kill -сигнал pid процесса

Если ты номер сигнала не укажешь, по умолчанию будет использовать сигнал -15 TERM. Это запрос на завершение программы и он не всегда срабатывает, но попробовать стоит, так как это вариант с корректным завершение процесса.

Если нужно точно убить процесс, то стоит использовать сигнал -9 KILL. При таком варианте процесс будет гарантировано завершен.

Ещё можно использовать команду killall. Ей нужно передавать не PID процесса, а его название. Например:

sudo killall thunderbird

Ещё одни вариант, это команда xkill. Вводим её в терминале, а потом просто клацаем мышью по программе которую нужно завершить. Ей будет передан сигнал -9.

Процессы Linux. Приоритет процесса

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

Когда мы запускаем программу htop, мы видим тот самый приоритет, обозначенный цифрой в диапазоне от -20 до 20. Эта цифра называется — фактор уступчивости, именно по нему ядро определяет кому давать больше ресурсов процессора. И чем эта цифра меньше тем выше приоритет. Соответственно процесс имеющий фактор уступчивости -20 имеет максимальный приоритет.

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

Есть два способа изменения приоритета. При запуске процесса и в процессе выполнения. Для того чтобы задать приоритет при запуске используется команда nice. После которой, используя параметр -n нужно указать значение фактора уступчивости, а потом указать название процесса или полностью строку запуска.

nice -n 10 firefox 

Если процесс уже выполняется, но нужно поменять приоритет, то для этого используется команда renice. После неё нужно указать новый приоритет и PID нужного процесса. Не забывай, что если ты не владелец процесса или хочешь увеличить приоритет то нужно использовать sudo.

sudo renice 0 35524
Приоритет процесса

Помимо приоритетов на использование ресурсов процессора, есть ещё приоритет ввода-вывода. Для его изменения используется команда ionice, после которой, используя параметр -n нужно указать нужный приоритет (тут используются значения от 0 до 7). А потом, после -p указать PID нужного процесса. Например:

ionice -n 3 -p 35524

Запуск процессов по расписанию. Демон cron

Иногда возникает необходимость запускать какие-то процессы автоматически по расписанию, без участия человека. Зачем тебе это понадобится придумай сам, а я расскажу про демона cron. Это такая штука которая позволяет выполнять команды по заданному расписанию. У него есть глобальная конфигурация для всей системы и локальная для каждого пользователя отдельно.

Файлы глобальной конфигурации лежат в каталоге /etc/cron.d, а локальной в /var/spool/cron/crontabs.

Рассмотрим как это работает на примере задач для конкретного пользователя. В каталоге /var/spool/cron/crontabs создаётся текстовый файл для каждого пользователя с расписанием запуска нужных процессов. Название этого файла — это имя пользователя. Нужно это для того чтобы демон cron понял от имени какого пользователя нужно выполнять команду. Настраивается всё это с помощью команды crontab.

Например, чтобы посмотреть список задач для пользователя dspulse, вводим команду:

crontab -u dspulse -l

Естественно изначально там ничего не будет, а чтобы создать расписание используем параметр -e:

crontab -u dspulse -e

Откроется текстовый файл в котором нужно создать расписание. Для этого сначала вписываем время записи, в формате: минут, час, день, месяц, день недели. Значения нужно разделять пробелами, также можно использовать диапазоны используя дефис. Звёздочка будет означать любое значение.

ПараметрДопустимое значание
минутаот 0 до 59
часот 0 до 23
деньот 1 до 31
месяцот 1 до 12
день неделиот 0 до 6 (0 — воскресенье)

Например:

45 17 1-30 * *

будет означать «в 17:45 с 1 по 30 число каждого месяца».

После времени выполнения, нужно указать команду которую нужно выполнить. Например:

45 17 * * 5 tar -zcf /var/backups/home.tgz /home/

Это будет означать что мы хотим каждую пятницу в 17:45 создавать архив домашнего каталога пользователя и помещать его в папку /var/backups/. Архив будет называться home.tgz.

Чтобы удалить все пользовательские расписания, используем параметр -r

crontab -u dspulse -r

В большинстве дистрибутивов есть ещё планировщик задач anacron. Это, по сути тоже самое что и cron, только он учитывает тот нюанс, что компьютер иногда, когда запланирована задача, может быть выключен. Он проверяет выполнялась ли нужная задача в нужное время и если не выполнялась, он её выполнит. А потом запишет информацию о выполнении в каталоге /var/spool/anacron. Это нужно для того чтобы одна и та же задача не была выполнена дважды. Anacron используется для выполнения дневных, недельных и месячных задач. Часовые задачи выполняет исключительно cron. Конфиг anacron в файле /etc/anacrontab.

Ну, а на этом, пожалуй, будем заканчивать. Тему «процессы Linux» можно считать рассмотренной и если ты дочитал до этого места, значит у тебя точно уже есть понимание как это всё работает. И это хорошо. Но не забывай возвращаться, ведь есть ещё очень много тем которые нам предстоит изучить.

Твой Pulse.