我正在尝试为特定用户启动 systemd 服务(服务名称/目标不相关)。我这样做是因为我需要在启动时运行应用程序的每个用户进程。
以下是我目前所取得的成就:
我在中创建一个单元文件/etc/systemd/用户/
然后做了以下事情:
〜$ systemctl --user启用custom.service
然后正如所说的https://wiki.archlinux.org/index.php/Systemd/User#Automatic_start-up_of_systemd_user_instances即使没有用户会话运行,也可以启用停留以使所述服务运行。
~ $ loginctl enable-linger $USER
但是当我重新启动时,该服务似乎没有启动,并且在 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/
并启用它。