Запустите службу пользователя systemd при загрузке

Я пытаюсь запустить службу systemd для конкретного пользователя (название / цель службы не имеет значения). Я делаю это, потому что мне нужно, чтобы при запуске приложения запускался пользовательский процесс.

Вот чего я добился до сих пор:

  • Я создаю файл модуля в / etc / systemd / user /
  • И затем сделал следующее:

    ~ $ systemctl --user enable custom.service

  • Затем, как было сказано в https://wiki.archlinux.org/index.php/Systemd/User долго поддерживать указанную службу, работающую даже при отсутствии сеанса пользователя.

    ~ $ loginctl enable-linger $ USER

Но когда я перезагружаюсь, служба, кажется, не запускается, и в journalctl ничего не видно для указанной службы. Но в статусе сказано, что сервис включен:

~ $ systemctl - демон передачи статуса пользователя

● custom.service - Пользовательский демон
Загружен: загружен (/etc/systemd/user/custom.service; включен; предустановка поставщика: включена)

Активный: неактивный (мертвый)

Также я могу запустить его вручную без проблем, запустив

~ $ systemctl - пользователь запускает custom.service

Как кто-нибудь есть идеи, что я сделал не так?

Спасибо!

4 ответа

Я не знаю, если это ваш случай, но я мог бы решить это с помощью ответа https://unix.stackexchange.com/questions/251211/why-doesnt-my-systemd-user-unit-start-at-boot Проблема был ли у меня WantedBy=multi-user.target и пришлось изменить его на WantedBy=default.target и это сработало.

Еще одна вещь, у меня есть файл службы в ~/.config/systemd/user

Единственное, что необходимо, из того, что я видел, это включить службу:

      ~ $ systemctl --user enable custom.service

и ты сказал, что сделал это.

Один из способов проверить, произошел ли запуск при перезагрузке, — убедиться в отсутствии ошибок. Вы делаете это, используяjournalctlкоманда:

      ~ $ journalctl --user -u custom.service

Обратите внимание -uопция означает единицу измерения .

Если там ничего не появляется, возможно, у вас недопустимая зависимость, то есть «хочет» для пользователяdefault.target. В вашем файле .service это должно выглядеть так:

      [Install]
WantedBy=default.target

Другие цели вряд ли будут работать, и автозапуск не удастся. При этом у пользователя есть цели, перечисленные:

      ~ $ systemctl --user list-units --type=target

Это не включает многопользовательский режим, xsession и т. д.

Наконец, среда X11 должна быть готова после запуска службы, но я не уверен в этом на 100%. В моем файле .service у меня также естьEnvironment=определение, которое звучит так:

      [Service]
Type=simple
Environment="DISPLAY=:0"
...snip...

У меня были проблемы, когда служба не могла открыть X-Window. С этим небольшим дополнением все сработало, как и ожидалось.

И последнее,User=...иGroup=...параметры не могут использоваться в пользовательской службе. Поскольку оно специфично для пользователя, вы не можете надеяться использовать конкретного пользователя для запуска этого приложения. Кроме того, на одном компьютере могут быть зарегистрированы несколько пользователей, и каждому из них потребуется своя собственная версия службы, работающая параллельно. Таким образом, другие параметры могут быть недоступны для пользовательской службы. Я бы посоветовал вам прокомментировать большую часть, а затем добавлять по одному, чтобы увидеть, что работает, а что нет в вашей ситуации. Однако именно эти ошибки вы увидите в журнале, поэтому их будет относительно легко исправить, если вы пропустите несколько других шагов.


Пост скриптум

Путь, по которому вы хотите сохранить пользовательскую службу:

      ~/.config/systemd/user/my-service.service

если вы не хотите, чтобы служба была доступна всем пользователям на этом компьютере, и в этом случае вы используете:

      /usr/lib/systemd/user/my-service.service

Дополнительную информацию см. на этой странице Archlinux .

Обратите внимание: я не думаю, что это была ваша проблема ( неправильное местоположение ), хотя это могло быть. Раньше у меня возникали трудности, когда я помещал системные файлы не в то место.

Как вы упомянули, другая ваша процедура кажется хорошей. Могу поспорить, что у вашего служебного файла есть некоторые проблемы. Поскольку я легко создавал служебные файлы, за исключениемtransmission-daemon.

Конфиги каждого служебного файла как-то индивидуально. Конечно, если есть генератор сервисов, напримерpodman generate systemdзатем используйте его.

Это мой служебный файл передачи. Если у вас есть для него файл монтирования, добавьте его вAfter. напримерAfter=network-online.target mountfilename.mount

      [Unit]
Description=Transmission BitTorrent Daemon
After=network-online.target

[Service]
User=username
Group=username
Type=simple
ExecStart=/usr/local/bin/transmission-daemon --config-dir /path/to/config/transmission-daemon -f --log-error
ExecReload=/bin/kill -s HUP $MAINPID
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Это для$ systemctl enable transmission-daemon, нет--userвариант.

WantedBy=multi-user.targetэто из-за моих настроек. Я рекомендуюWantedBy=default.targetслишком.

Дляsystemctl --user enable,

      [Unit]
Description=Transmission BitTorrent Daemon
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/transmission-daemon --config-dir /path/to/config/transmission-daemon -f --log-error
ExecReload=/bin/kill -s HUP $MAINPID
NoNewPrivileges=true

[Install]
WantedBy=default.target

Но в этом случае вы не сможете поместить служебный файл/etc/systemd/user. Поместите это в~/.config/systemd/user/. и включите его.

Создайте новый файл с именемcustom_daemon_service.serviceв/etc/systemd/system/со следующим содержанием:

      [Unit]
Description=Your Custom Daemon Service

[Service]
ExecStart=your-command-here   # e.g. /bin/bash echo "Hello!"
Restart=on-failure

[Install]
WantedBy=multi-user.target

Теперь вы можете сделатьsudo systemctl enable --now custom_daemon_serviceчтобы убедиться, что служба запускается при загрузке, и запустит ее сейчас.

Если вам интересно, у меня есть сообщество разработчиков .

Другие вопросы по тегам