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

60

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

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

description "NZBGet upstart script"

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

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

[Unit]
Description=NZBGet Service

[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: я хочу, чтобы он запускался при загрузке, запускался постоянно и как конкретный пользователь.

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

    
задан void.pointer 19.09.2015 в 18:17
источник

2 ответа

75

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

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

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

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

Другие папки:

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

Тестирование устройства

После того, как файл устройства находится в соответствующем месте, вы можете попробовать запустить устройство сразу, набрав systemctl start <UNIT_FILENAME> , как обычно. Он должен работать без ввода полного пути устройства. Расширение также не нужно указывать, если оно .service .

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

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

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

    
ответ дан Yamaho 19.09.2015 в 18:51
источник
19

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

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

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

    
ответ дан byteborg 11.12.2016 в 21:28