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