- Вопрос или проблема
- Первая проблема
- Вторая проблема
- Тестирование юнита
- Включение юнита
- Ответ или решение
- 1. Создание файла службы
- 2. Правильное местоположение файла службы
- 3. Активация службы
- 4. Проверка работоспособности
- 5. Учет пользователя и функция "linger"
- 6. Управление пользовательскими службами
- Заключение
Вопрос или проблема
Я только что обновил сервер 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. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.