Я только что обновился с 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
для управления и настройки службы (служб), которая будет работать в диспетчере служб вашего пользователя, а не в системе.