在启动时启动 systemd 用户服务

在启动时启动 systemd 用户服务

我正在尝试为特定用户启动 systemd 服务(服务名称/目标不相关)。我这样做是因为我需要在启动时运行应用程序的每个用户进程。

以下是我目前所取得的成就:

但是当我重新启动时,该服务似乎没有启动,并且在 journalctl 中看不到该服务的任何内容。但状态显示该服务已启用:

~ $ systemctl --用户状态传输守护进程

● custom.service - 自定义守护进程
已加载:已加载(/etc/systemd/user/custom.service;已启用;供应商预设:已启用)

活跃:不活跃(死亡)

另外我可以通过运行手动运行它而不会出现问题

~ $ systemctl --user 启动 custom.service

有人知道我做错了什么吗?

答案1

我不知道这是否是你的情况,但我可以用以下答案来解决这个问题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

答案2

据我所见,唯一需要做的就是启用该服务:

~ $ systemctl --user enable custom.service

你说你已经做到了。

检查重新启动时是否启动的一种方法是验证没有错误。您可以使用以下journalctl命令执行此操作:

~ $ journalctl --user -u custom.service

注意:该-u选项代表单元

如果其中没有出现任何内容,则可能是存在无效的依赖项,即用户的“wants”是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 页面了解其他详细信息。

请注意,我不认为那是你的问题(错误位置) 虽然本来可以。我以前也遇到过这样的问题,当时我将 systemd 文件放在了错误的位置。

答案3

正如您提到的transmission-daemon,您的其他程序看起来不错。我敢打赌你的服务文件肯定存在一些问题。因为除了之外我可以轻松创建服务文件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/并启用它。

相关内容