为什么我启用的 systemd 服务无法在启动时启动?

为什么我启用的 systemd 服务无法在启动时启动?

我有以下 systemd 单元文件/etc/systemd/system/emacs.service

[Unit]
Description=Emacs: the extensible, self-documenting text editor
Documentatin=man:emacs(1) info:Emacs


[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(progn (setq kill-emacs-hook nil) (kill-emacs))"
Restart=always
Environment=DISPLAY=:%i
TimeoutStartSec=0

[Install]
WantedBy=default.target

我希望它在启动时启动,所以我输入了systemctl enable emacs

但是,每次我的服务重新启动时,systemctl status emacs都会显示:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

但随后输入systemctl start emacs并检查状态返回:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2016-11-11 23:03:59 UTC; 4s ago
  Process: 3151 ExecStart=/usr/bin/emacs --daemon (code=exited, status=0/SUCCESS)
 Main PID: 3154 (emacs)
    Tasks: 2
   Memory: 7.6M
      CPU: 53ms
   CGroup: /system.slice/emacs.service
           └─3154 /usr/bin/emacs --daemon

我怎样才能让这个过程在启动时成功启动?

答案1

我不知道为什么,但为了让它发挥作用,我:

已删除Environment=DISPLAY=:%i

添加了一个User=变量

确保正确的文件位于/etc/systemd/system/emacs.service(之前它是硬链接)

并重新运行systemctl enable emacs

这使它发挥作用。

编辑 这里真正的问题是我在第 3 行有一个拼写错误: Documentatin

我通过检查发现了这一点journalctl。我建议任何对 systemd 脚本有问题的人都做同样的事情,因为没有错误发送到 stderr。

答案2

您有一个 DISPLAY 环境变量,这意味着您希望启动 X11。因此,在此之前您需要有一种方法来阻止您的服务。

这是使用完成的选项After=...

我自己没有做过,所以我不能说它会起作用,但这可能与graphical.target.

[Unit]
After=graphical.target

另一种可能性是,如果 X 服务器没有立即启动(即您有一个带有 lightdm 等的登录屏幕),那么您可能必须使用WantedBy=...反而:

[Unit]
WantedBy=graphical.target

如果您厌倦了让它与 systemd 一起工作,您可能想研究 X-Windows 管理器使其工作的常用方式。

~/.xprofile文件,其工作方式与~/.bashrc文件类似。

还有~/.config/autostart/*.desktop文件。它将自动启动其中定义的所有应用程序。

不过,这些解决方案不是系统范围内的,如果您有多个用户,每个用户都必须有自己的条目。此外,它不会以 root 身份启动应用程序,而是以您的身份启动应用程序。


附带说明一下,“loaded + inactive (dead)”消息意味着 systemd 很难启动该进程,因此决定放弃它。您可以使用以下命令手动测试name.service重新启动后是否有效:

systemctl stop <service-name>
systemctl start <service-name>

这会刷新假设信息正确,状态并正确启动服务。然后您可以再次检查状态以查看其他详细信息:

systemctl status <service-name>

答案3

启用该服务后检查您的链接在哪里。只是补充一下我对此的看法。当我执行时,sudo systemctl enable myserevice.service它在文件夹中创建了链接,multi-user.target.wants但不在真实的multi-user.target.wants.它在一些同名的新文件夹中创建。WantedBy=multi-user.target我的文本编辑器没有显示一些额外的字符。所以,我不知道那是什么。我只是从另一个 .service 文件中进行 c/p,然后再次启用,现在链接位于正确的文件夹中

答案4

这是 Debian 的几个服务文件中的一个错误:

# systemctl enable watchdog
Synchronizing state of watchdog.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable watchdog
# find /etc/systemd/ | grep watch
# tail -n2 /lib/systemd/system/watchdog.service

[Install]

https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=218609&p=1406567#p1406567 https://forum.armbian.com/topic/9115-still-dont-know-where-to-report-bugs-watchdogservice-refuses-to-start-due-to-broken-service-file/

分发级别修复是

echo "WantedBy=default.target" >> /lib/systemd/system/watchdog.service
systemctl daemon-reexec
systemctl enable watchdog
systemctl stop watchdog.service
systemctl start watchdog.service

有许多手动替代方案。

相关内容