太长了;博士

太长了;博士

我希望用户服务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.targetWantedBy=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.targetxdg-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.targetby的所有实例default.target(包括AfterWantedBy行)。这导致我当前的服务文件:

[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 文件:

  1. 将其放在 /etc/systemd/system 文件夹中,名称为 myfirst.service
  2. 确保您的脚本可执行:
chmod u+x /path/to/spark/sbin/start-all.sh
  3. 启动它:
sudo systemctl start myfirst
  4. 使其在启动时运行:
sudo systemctl enable myfirst
  5. 停下来:
sudo systemctl stop myfirst

相关内容