ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Пятница, 25 апреля, 2025
Сегодня у нас 1 праздник:
В 1874 году родился Гульельмо Маркони (1874-1937), маркиз, итальянский радиотехник и предприниматель, один из изобретателей радио; лауреат Нобелевской премии по физике за 1909 год.

Как использовать Systemd для запуска Bash-скриптов при загрузке в Linux

Как использовать Systemd для запуска Bash-скриптов при загрузке в Linux

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

Решение простое, и сегодня я покажу вам, как это сделать с помощью сервисов systemd, но прежде чем мы перейдём к этому, давайте вкратце рассмотрим, что такое сервис и как он работает.

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

 

Что такое сервисный модуль Systemd?

Проще говоря, сервис в systemd — это файл конфигурации, который определяет, как сервис должен работать в вашей системе. Это может быть что-то вроде сетевой службы, программы или даже скрипта, который должен запускаться при загрузке компьютера или в определённый момент во время загрузки.

Эти служебные модули сгруппированы в целевые объекты, которые можно рассматривать как этапы или стадии процесса загрузки. Например, когда ваша система достигает многопользовательской цели (уровень выполнения 3), запускаются определённые службы. Вы можете рассматривать эти целевые объекты как «коллекции» служб, которые работают вместе на разных этапах загрузки.

Если вы хотите просмотреть службы, работающие в определённой цели (например, graphical.target), вы можете использовать команду systemctl:
systemctl --type=service

 

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

 

Проверка состояния службы

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

systemctl status firewalld.service

 

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

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

systemctl stop firewalld.service
systemctl status firewalld.service

 

Это остановит службу брандмауэра на этом сеансе, но не помешает её запуску в следующий раз.

 

Включение и отключение Служб

Чтобы служба автоматически запускалась при загрузке, необходимо включить её, создав символическую ссылку в соответствующей папке:

systemctl enable firewalld.service

 

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

systemctl disable firewalld.service

 

Создание пользовательского сервисного подразделения

Чтобы настроить службу, которая запускает скрипт при загрузке, мы создадим новую служебную единицу в каталоге /etc/systemd/system. Здесь вы увидите существующие служебные файлы и папки для разных целей.

cd /etc/systemd/system
ls -l

 

Давайте создадим собственное служебное подразделение под названием connection.service с помощью Vim или вашего предпочтительного текстового редактора:

vim connection.service

или
vi connection.service

 

Добавьте в файл следующее содержимое.

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

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

[Install]
WantedBy=multi-user.target

 

Объяснение:

 

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

systemctl enable connection.service

 

Вы можете подтвердить, что он был включен, проверив каталог multi-user.target.wants:

ls -l multi-user.target.wants/

 

Символическая ссылка на connection.service теперь должна присутствовать. Однако нам всё равно нужно создать скрипт, который будет запускать этот сервис.

 

Создание скрипта

Теперь давайте создадим скрипт conup.sh, который запустит сетевое подключение.

cd /root
mkdir scripts
cd scripts
vi conup.sh

 

Добавьте следующую строку, чтобы включить сеть. Здесь скрипт использует команду nmcli для включения сетевого подключения на интерфейсе enp0s3.

#!/bin/bash
nmcli connection up enp0s3

 

Не забудьте сделать скрипт исполняемым.

chmod +x conup.sh

 

На этом этапе сервис готов к работе.

 

Тестирование сервиса

Чтобы протестировать его без перезагрузки, вы можете запустить вручную.

systemctl start connection.service

 

Если всё настроено правильно, служба выполнит скрипт, и ваше сетевое подключение будет восстановлено.

В качестве альтернативы, если вы написали более простой скрипт, например touch /tmp/testbootfile, вы можете проверить, был ли создан файл в /tmp, чтобы убедиться, что служба работает должным образом.

 

Заключение

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

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

Exit mobile version