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

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

Вот каким был мой сценарий выскочки раньше:

description "NZBGet upstart script"setuid robertsetgid robertstart on runlevel [2345]stop on runlevel [016]respawnexpect forkscript    exec nzbget -Dend scriptpre-stop script    exec nzbget -Qend script

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

[Unit]Description=NZBGet Service[Service]Type=forkingExecStart=/usr/local/bin/nzbget -DExecStop=/usr/local/bin/nzbget -QRestart=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 <UNIT_FILENAME> как обычно. Он должен работать без необходимости вводить полный путь устройства. Расширение также не обязательно указывать, если оно .service.

Включение устройства

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

Как только эта информация будет добавлена, вы сможете использовать systemctl enable <UNIT_FILENAME>, который включает устройство, заставляя systemd отныне автоматически запускать его во время загрузки на указанном этапе.

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

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

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