启动时启动 systemd 用户服务

Jes*_*_21 15 arch-linux daemon systemd

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

这是我迄今为止取得的成就:

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

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

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

活动:不活动(死)

我也可以通过运行手动运行它,没有问题

~ $ systemctl --user start custom.service

任何人都知道我做错了什么?

小智 22

我不知道这是否是您的情况,但我可以通过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


Ale*_*lke 6

据我所知,唯一必要的是启用该服务:

~ $ systemctl --user enable custom.service
Run Code Online (Sandbox Code Playgroud)

你说你已经做到了。

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

~ $ journalctl --user -u custom.service
Run Code Online (Sandbox Code Playgroud)

注:该-u选项代表单位

如果那里没有出现任何内容,则您可能有一个无效的依赖项,即用户的“想要”是default.target。在您的 .service 文件中,它应该如下所示:

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

其他目标不太可能起作用,并且自动启动将会失败。话虽这么说,用户的目标列出如下:

~ $ systemctl --user list-units --type=target
Run Code Online (Sandbox Code Playgroud)

这不包括多用户、xsession 等。

最后,一旦服务启动,X11 环境就应该准备就绪,但我对此并不能 100% 确定。在我的 .service 文件中,我还有一个Environment=如下定义:

[Service]
Type=simple
Environment="DISPLAY=:0"
...snip...
Run Code Online (Sandbox Code Playgroud)

我遇到了服务无法打开 X-Window 的问题。添加了这一小部分后,它就按预期工作了。

最后一件事,User=...Group=...参数不能在用户服务中使用。由于它是特定于用户的,因此您不能希望使用特定用户来运行该应用程序。另外,多个用户可以登录同一台计算机,并且每个用户都需要并行运行自己的服务版本。因此其他选项可能无法供用户服务使用。我建议您注释掉大部分内容,然后一次添加一项,看看哪些内容在您的情况下有效,哪些无效。不过,这些错误是您将在日志中看到的错误,因此一旦绕过其他几个步骤,修复起来应该相对容易。


后记

您要保存用户服务的路径是:

~/.config/systemd/user/my-service.service
Run Code Online (Sandbox Code Playgroud)

除非您希望该计算机上的所有用户都可以访问该服务,在这种情况下您可以使用:

/usr/lib/systemd/user/my-service.service
Run Code Online (Sandbox Code Playgroud)

有关其他详细信息,请参阅此archlinux 页面。

请注意,我不认为这是你的问题(错误的位置),尽管它可能是。以前,当我将 systemd 文件放在错误的位置时,我遇到过困难。