береженого кольт бережет
береженого кольт бережет

Управляем автозагрузкой в Linux

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.