Как создать и запустить новые сервисные модули в 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. .
Я очень надеюсь помочь вам понять, что такое службы, потребности, цели и запуск сценариев во время загрузки.