Как заставить мою службу systemd работать от конкретного пользователя и запускаться при загрузке?

Вопрос или проблема

Я только что обновил сервер Ubuntu с версии 14 до версии 15. У меня возникли проблемы с работой моего скрипта upstart после обновления, и я прочитал, что systemd является новым стандартом. Я далек от экспертности в linux, поэтому, пожалуйста, будьте ко мне терпимы 🙂

Вот как выглядел мой скрипт upstart до:

description "Скрипт upstart для NZBGet"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Исходя из страницы вики о переходе с upstart на systemd, я использовал предоставленные там таблицы, чтобы максимально точно сопоставить вещи в моем новом файле службы systemd:

[Unit]
Description=Служба NZBGet

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Этот файл расположен по адресу /home/robert/.config/systemd/user/nzbget.service. Чтобы вручную запустить службу, я делал:

$ systemctl --user start nzbget

Это работает отлично. Однако, когда я выхожу из своей SSH-сессии, служба отключается. Также она не запускается при загрузке или входе пользователя. Я хочу, чтобы она работала так же, как и ранее в качестве службы upstart: я хочу, чтобы она запускалась при загрузке, постоянно работала и запускалась от имени конкретного пользователя.

Что мне нужно сделать, чтобы получить эту конфигурацию?

Первая проблема

Вы можете указать директивы User= и Group= в разделе [Service] файла конфигурации.

Вторая проблема

Чтобы служба запускалась при загрузке, вам не следует помещать ее в свою домашнюю папку. Вместо этого разместите ее в /etc/systemd/system/. Это папка, предназначенная для использования системным администратором (т.е. вами) для добавления новых системных служб.

Другие папки включают:

  • /usr/lib/systemd/system/ предназначена для пакетов, которые хотят установить файлы юнитов, хотя в Debian и Ubuntu эта папка на самом деле /lib/systemd/system/, потому что различные папки bin и lib еще не объединены в единый префикс /usr/.
  • /usr/local/lib/systemd/system/ предназначена для установки юнитов локально скомпилированными пакетами.

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

Как только файл юнита находится в подходящем месте, вы можете попробовать запустить юнит немедленно, набрав systemctl start <ИМЯ_ЮНИТА> как обычно. Он должен работать без необходимости вводить полный путь к юниту. Также расширение не нужно указывать, если это .service.

Включение юнита

Перед тем как вы сможете включить свой юнит, вам нужно добавить раздел [Install], в котором следует добавить директиву WantedBy=multi-user.target. Эта директива указывает этап загрузки, на котором служба должна быть запущена (если она была бы включена). multi-user.target подходит для большинства служб.

После добавления этой информации вы можете использовать systemctl enable <ИМЯ_ЮНИТА>, что включает юнит, позволяя systemd автоматически запускать его во время загрузки на указанном этапе.

Вам может быть интересно использовать функциональность ожидания пользователя в systemd. Она включается с помощью loginctl enable-linger USERNAME.

Это вызывает запуск отдельного менеджера служб для соответствующего пользователя при загрузке, так что ваши определенные пользователем юниты в ~/.config/systemd/user будут обработаны и запущены во время загрузки и завершения работы в соответствии с конфигурацией вашей службы.

Вы также можете использовать systemctl --user для управления и настройки службы(ей), что будет работать с менеджером служб вашего пользователя, а не с системным менеджером.

Ответ или решение

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

1. Создание файла службы

Как вы уже сделали, ваш файл службы должен выглядеть следующим образом, с учётом добавления параметров User и Group:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
User=robert
Group=robert
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

[Install]
WantedBy=multi-user.target

2. Правильное местоположение файла службы

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

sudo mv /home/robert/.config/systemd/user/nzbget.service /etc/systemd/system/nzbget.service

3. Активация службы

Не забудьте включить службу для автоматического запуска при загрузке:

sudo systemctl enable nzbget.service

4. Проверка работоспособности

Теперь вы можете протестировать вашу службу. Запустите сервер:

sudo systemctl start nzbget.service

Проверьте состояние службы:

sudo systemctl status nzbget.service

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

5. Учет пользователя и функция "linger"

Если вы хотите управлять пользовательскими службами, запущенными в контексте конкретного пользователя, вам следует рассмотреть возможность использования функции "linger". Это позволяет вашему пользователю иметь активные службы при загрузке, даже если он не вошёл в систему.

Чтобы включить "linger" для пользователя robert, выполните:

sudo loginctl enable-linger robert

Это действие создаст отдельный менеджер служб для пользователя, что обеспечит автоматический запуск его пользовательских служб, находящихся в ~/.config/systemd/user.

6. Управление пользовательскими службами

Теперь вы можете управлять своими пользовательскими службами с помощью команды systemctl --user. Например:

systemctl --user start nzbget
systemctl --user status nzbget

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...