Systemd — управление автозагрузкой служб в Linux
В большистве популярных современных популярных дистрибутивов Linux (CentOS, RHEL, Debian, Fedora и Ubuntu) в качестве демона автозагрузки вместо init.d используется systemd.
Systemd – менеджер системы и служб Linux, используется для запуска других демонов и управления ими в процессе работы, использует unit-файлы из /etc/systemd/system (init.d использовал скрипты из каталога /etc/init.d/). Systemd позволяет распараллелить запуск служб в процессе загрузки ОС, тем самым ускоряя запуск.
Для управления system используется команда systemctl.
Для начала, после загрузки системы, мы проверим список юнитов, которые в данный момент добавлены в systemd:
systemctl list-units
Список unit-файлов можно получить командой:
systemctl list-unit-files
Данная команда отобразит все доступные юнит-файлы (не зависимо от того, были они загружены в systemd после загрузки ОС или нет).
Чтобы вывести список активных сервисов и их состояние, выполните:
systemctl list-units -t service
Следующая команда выведет список юнитов, которые загрузил или пытался загрузить systemd. Так как после запуска некоторые юниты могут стать неактивными, с помощью флага — all вы получите полный список.
systemctl list-units --all
Добавление сервиса в systemd
Для управления сервисами в systemd используется особый синтаксис. После имени серверсв в конце нужно указывать .service. Например:
systemctl enable nginx.service
команда добавит в автозагрузку веб-сервер nginx
Данная команда создаст символическую ссылку на копию файла, указанного в команде сервиса, в директории автозапуска systemd.
systemctl enable nginx.service
Вывод этой команды показывает в какой директории был создан симлинк на файл сервиса.
Чтобы посмотреть добавлен тот или иной сервис в автозагрузку, можно проверить его статус:
systemctl status nginx.service
При выводе нужно обратить внимание на строку:
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Значение enabled означает что данный сервис загружается автоматически (добавлен в автозагрузку). Если сервис не загружается автоматом, здесь буде указано disabled.
Удаление сервиса из systemd
Вы можете удалить сервис из автозагрузки, чтобы он не запускался после старта Linux (при этом сам сервис с сервера не удаляется). Чтобы удалить сервис из автозагрузки, выполните команду (* — нужный сервис):
systemctl disable *.service
Например, чтобы удалить из автозагрузки nginx, выполните:
systemctl disable nginx.service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service
После выполнения команды, симлинк на файл сервиса будет удален из директории systemd. Можно проверить, есть ли юнит в автозагрузке:
systemctl is-enabled sshd
Systemd — маскировка юнитов
Иногда встречаются ненужные сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускаются после перезагрузки. Чтобы решить этот вопрос, можно замаскировать сервис:
systemctl mask nginx.service
И после этого он вообще не будет запускаться:
systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
service nginx restart
Redirecting to /bin/systemctl restart nginx.service
Failed to restart nginx.service: Unit is masked.
Снять маску можно командой:
systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.
Если после маскировки сервиса, вы проверите юнит-файлы, то увидите, что сервис помечен как замаскированный (состояние masked).
Таким нехитрым способом, можно избавить себя от удаления сервиса, даже если он не удаляется из автозагрузки systemd.
Собственный демон и добавление его в systemd
Можно создать собственный демон, которым будем управлять через systemd.
Например, нам нужно запускать все тот же скрипт /root/script.sh после перезагрузки системы. Начнем с создания файла нашей будущей службы:
touch /etc/systemd/system/script.service
chmod 664 /etc/systemd/system/script.service
nano /etc/systemd/system/script.service
Содержимое файла будет следующее:
[Unit]
Description=Template Settings Service
After=network.target
[Service]
Type=oneshot
User=root
ExecStart=/root/script.sh
[Install]
WantedBy=multi-user.target
Основные параметры:
User — пользователь под которым будет запускаться демон
Type=oneshot — процесс будет завершен до запуска дальнейших юнитов
Проверяем и перезапускаем:
systemctl daemon-reload
systemctl start test-script.service
systemctl status test-script.service
Output
● script.service - Test
Loaded: loaded (/etc/systemd/system/script.service; disabled; vendor preset: disabled)
Active: active (running)
Если все хорошо, добавляем его в автозагрузку:
systemctl enable script.service
Created symlink from /etc/systemd/system/multi-user.target.wants/script.service to /etc/systemd/system/script.service.
Таким образом, мы можем добавить любой скрипт в автозагрузку через systemd.