我希望用户服务nfancurve.service
在每次登录时开始运行。我之前使用命令启用了该服务systemctl --user enable nfancurve.service
,但是,每次我启动新会话(包括重新启动)时,该服务都没有运行,尽管它已启用,我对此进行了验证登录后运行以下命令:
name@machine:~$ systemctl --user is-active nfancurve.service
inactive
name@machine:~$ systemctl --user is-enabled nfancurve.service
enabled
name@machine:~$ systemctl --user start nfancurve.service
name@machine:~$ systemctl --user is-active nfancurve.service
active
这是来自以下位置的状态日志systemctl --user status nfancurve.service
:
● nfancurve.service - Nfancurve service
Loaded: loaded (/usr/lib/systemd/user/nfancurve.service; enabled; vendor preset: enabled)
Active: inactive (dead)
有关完整信息,该服务来自这个存储库,我从 AUR 安装的。该.service
文件如下所示:
[Unit]
Description=Nfancurve service
After=graphical-session.target
Requires=graphical-session.target
[Service]
ExecStart=/bin/sh /usr/bin/nfancurve -c /etc/nfancurve.conf
KillSignal=SIGINT
[Install]
WantedBy=graphical-session.target
我已经尝试将最后一行更改为WantedBy=default.target
,但重新启动并登录后服务仍然没有启动。我的桌面环境是 xfce,以防考虑到graphical-session.target
.
如何确保它在每次登录时自动启动?
答案1
太长了;博士
改成。WantedBy=graphical-session.target
WantedBy=default.target
假设
我怀疑您的问题出在[Install]
您的服务文件部分。对于系统单元来说,基于安装它multi-user.target
可能很正常,但对于用户单元来说,等效的安装是default.target
。请参阅systemd.special(7) 联机帮助页了解详情。
| system target | near-equivalent user target |
|-------------------|-----------------------------|
| multi-user.target | default.target |
| graphical.target | graphical-session.target |
您可能也感兴趣的其他目标是graphical-session-pre.target
或xdg-desktop-autostart.target
。
默认.目标 MVCE
这是我刚刚在 Debian 11 机器上尝试过的一个最小示例:
服务文件:
$ systemctl --user cat simpleuser.service
# /home/stew/.config/systemd/user/simpleuser.service
[Unit]
Description=Simple User Service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
[Install]
WantedBy=default.target
我安装了它:
$ systemctl --user enable simpleuser.service
Created symlink /home/stew/.config/systemd/user/default.target.wants/simpleuser.service → /home/stew/.config/systemd/user/simpleuser.service.
我重新启动后可以看到该服务处于活动状态:
$ systemctl --user status simpleuser.service
● simpleuser.service - Simple User Service
Loaded: loaded (/home/stew/.config/systemd/user/simpleuser.service; enabled; vendor preset: enable>
Active: active (exited) since Sun 2020-07-12 10:12:54 CEST; 13min left
Process: 1127 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 1127 (code=exited, status=0/SUCCESS)
Jul 12 10:12:54 stewbian systemd[1106]: Starting Simple User Service...
Jul 12 10:12:54 stewbian systemd[1106]: Finished Simple User Service.
如果您想知道(exited)
子状态:如果您使用类似Type=simple
和 的内容ExecStart=/bin/sleep infinity
,那么您会得到(running)
。
图形会话目标问题
我以错误报告的形式找到了您的问题在 github 上。
如果您基于graphical-session.target进行安装,则可能无法启动。我刚刚在我的 KDE/i3 设置上运行了这个,并在普通的 Gnome3 设置上重现。
$ systemctl --user status graphical-session.target
● graphical-session.target - Current graphical user session
Loaded: loaded (/usr/lib/systemd/user/graphical-session.target; static; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
听起来 DE 并没有真正按照其设计实现这一目标。在这种情况下,使用WantedBy=default.target
.你的脚本看起来不是基于 GUI 的,所以我打赌default.target
应该没问题。否则,您可以考虑After=graphical.target
在您的[Unit]
部分中使用。
根据systemd.special(7) 联机帮助页,graphical-session.target
应该是BoundBy=
DE(即{gnome,kde,xfce}-session.target
)。这样,当 Gnome 启动时,它会引发graphical-session.target。当我检查 dbus 对象时,我清楚地看到与任何会引发它的目标没有任何关系。
$ busctl introspect --user org.freedesktop.systemd1 \
/org/freedesktop/systemd1/unit/graphical_2dsession_2etarget \
org.freedesktop.systemd1.Unit
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.ActiveState property s "inactive" emits-change
.After property as 2 "simpleuser.service" "basic.target" const
.Before property as 1 "shutdown.target" const
.BindsTo property as 0 const
.BoundBy property as 0 const
.Conflicts property as 1 "shutdown.target" const
.ConsistsOf property as 2 "gnome-terminal-server.service" "duns… const
.Description property s "Current graphical user session" const
.Documentation property as 1 "man:systemd.special(7)" const
.LoadState property s "loaded" const
.Names property as 1 "graphical-session.target" const
.PartOf property as 0 const
.RequiredBy property as 0 const
.Requires property as 1 "basic.target" const
.SubState property s "dead" emits-change
.UnitFilePreset property s "disabled" -
.UnitFileState property s "static" -
.WantedBy property as 0 const
.Wants property as 1 "simpleuser.service" const
我深入研究了邮件列表,发现{gnome,kde,xfce}-session.target
四年前才提出这个建议,目的是让 gnome、kde、xfce 发送这些*.target
文件。这还没有发生。因此,即使有记录,它也是不完整的。因此您还不应该使用graphical-session.target
。
答案2
我终于找到了解决方案(感谢斯图尔特和其他人)。我更改了原来的服务文件:
[Unit]
Description=Nfancurve service
After=graphical-session.target
Requires=graphical-session.target
[Service]
ExecStart=/bin/sh /usr/bin/nfancurve -c /etc/nfancurve.conf
KillSignal=SIGINT
[Install]
WantedBy=graphical-session.target
通过删除 Requires 行并替换graphical-session.target
by的所有实例default.target
(包括After
和WantedBy
行)。这导致我当前的服务文件:
[Unit]
Description=Nfancurve service
After=default.target
[Service]
ExecStart=/bin/sh /usr/bin/nfancurve -c /etc/nfancurve.conf
KillSignal=SIGINT
[Install]
WantedBy=default.target
现在,当我启动计算机并登录时,该服务处于活动状态。
答案3
您的 .service 文件应如下所示:
[Unit]
Description=Spark service
[Service]
ExecStart=/path/to/spark/sbin/start-all.sh
[Install]
WantedBy=multi-user.target
现在,采取更多步骤来启用和使用 .service 文件:
- 将其放在 /etc/systemd/system 文件夹中,名称为 myfirst.service
- 确保您的脚本可执行:
chmod u+x /path/to/spark/sbin/start-all.sh
- 启动它:
sudo systemctl start myfirst
- 使其在启动时运行:
sudo systemctl enable myfirst
- 停下来:
sudo systemctl stop myfirst