Поиск по сайту:

Как создать и запустить новые сервисные модули в Systemd


Несколько дней назад я наткнулся на 32-битный дистрибутив Centos 8 и почувствовал желание протестировать его на старой 32-битной машине. После загрузки я понял, что в нем возникла ошибка и он терял сетевое соединение, которое мне приходилось включать вручную каждый раз после загрузки. Итак, вопрос заключался в том, как я могу настроить сценарий, выполняющий эту работу, который будет запускаться каждый раз, когда я загружаю свою машину?

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

В этой статье я собираюсь объяснить, что такое «сервисный модуль» в systemd и насколько легко его создать и запустить. Я попытаюсь упростить, что такое «цели», почему мы называем их «коллекциями единиц» и каковы их «желания». Наконец, мы воспользуемся сервисным модулем для запуска собственного сценария после процедуры загрузки.

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

Другие службы вызываются для выполнения, когда компьютер достигает, например, уровня восстановления (уровень запуска 0), а другие – когда он достигает многопользовательского уровня (уровень запуска 3). . Вы можете представить эти уровни как цели.

Проще говоря, target — это набор сервисных единиц. Если вы хотите просмотреть сервисные единицы, работающие на вашем уровне graphical.target, введите:

systemctl --type=service

Как вы можете видеть, некоторые службы активны и «работают» все время, в то время как другие запускаются один раз и завершают работу (выходят).

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

systemctl status firewalld.service

Как видите, я проверил статус firewalld.service (совет: вы можете использовать автозаполнение имени службы. ). Он сообщает мне, что служба firewalld работает постоянно и включена.

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

Например, если вы наберете:

systemctl stop firewalld.service
systemctl status firewalld.service

Вы можете видеть, что firewalld.service неактивен (неактивен), но все еще включен, а это значит, что при следующей загрузке он будет загружен. Поэтому, если мы хотим, чтобы служба загружалась во время загрузки в будущем, мы должны включить ее. Какой замечательный вывод! Давайте создадим его, это несложно.

Если вы зайдете в папку:

cd /etc/systemd/system
ls -l

Вы можете увидеть некоторые файлы ссылок сервисов модулей и некоторые каталоги «хочет» цели. Например, то, что многопользовательская цель хочет загрузить, когда процедура загрузки достигает своего уровня, указано в каталоге с именем /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Как видите, он содержит не только сервисы, но и другие цели, которые также являются коллекциями сервисов.

Давайте создадим сервисный модуль с именем connection.service.

vim connection.service

и введите следующее (нажмите “i ” для режима вставки), сохраните его и выйдите (с помощью “esc ” и “:wq!” ) :

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Чтобы объяснить вышесказанное: мы создали единицу типа службы (вы также можете создавать единицы целевого типа) и установили ее загрузку после network.target (вы можете понять, что процедура загрузки достигает целей в определенном порядке), и мы хотим, чтобы каждый раз, когда служба начинает выполнять bash-скрипт с именем conup.sh, который мы собираемся создать.

Самое интересное начинается с последней части [install]. Он сообщает, что он будет востребован “multi-user.target”. Поэтому, если мы включим нашу службу, в папке multi-user.target.wants будет создана символическая ссылка на эту службу! Понятно? И если мы отключим его, эта ссылка будет удалена. Так просто.

Просто включите его и проверьте:

systemctl enable connection.service

Он сообщает нам, что символическая ссылка в папке multi-user.target.wants создана. Вы можете подтвердить это, выполнив команду ls, как показано.

ls multi-user.target.wants/

Как видите, connection.service готов к следующей загрузке, но сначала нам необходимо создать файл сценария.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Добавьте следующую строку в Vim и сохраните ее:

#!/bin/bash
nmcli connection up enp0s3

Команда nmcli для установления сетевого подключения для интерфейса enp0s3.

Конечно, если вы хотите, чтобы ваш скрипт выполнял что-то еще, вы можете ввести вместо второй строки все, что захотите.

Например,

#!/bin/bash
touch /tmp/testbootfile

это создаст файл в папке /tmp (просто для проверки работоспособности вашего сервиса).

Мы также должны сделать скрипт исполняемым, выполнив команду chmod, как показано.

chmod +x conup.sh

Теперь мы готовы. Если вы не хотите ждать до следующей загрузки (она уже включена), мы можем запустить службу для текущего сеанса, набрав:

systemctl start connection.service

Вуаля! Мое соединение установлено и работает!

Если вы решили написать команду “touch /tmp/testbootfile” внутри скрипта, просто чтобы проверить его функциональность, вы увидите этот файл, созданный в папке /tmp. .

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