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


20

我在以下系统文件单元中/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

如何获得此过程以在启动时成功启动?

Answers:


9

我不知道为什么要让它起作用,我:

已删除 Environment=DISPLAY=:%i

添加了一个User=变量

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

然后重新运行 systemctl enable emacs

这使它起作用。

编辑 这里真正的问题是我在第3行有错别字: Documentatin

我通过检查发现了这一点journalctl。我建议任何与systemd脚本有关的人都执行相同的操作,因为没有错误发送到stderr。


重启后还能用吗?我猜想,如果守护程序模式不需要X11连接,那么就不需要After=...我提到的了。
亚历克西斯·威尔克

1
是的,重新启动后可以使用。这不是图形化的Emacs,因此不需要X11。那只是我从示例中复制的一行,没有引起注意。
Startec '16

3

哦,这很有趣。

选择一个随机的服务单位并盯着它,它取决于特定的目标而不是default.target。后者是象征性的...指向特定目标的配置链接,从语义上讲这没有意义。(请参阅systemctl set-default

这可以解释为什么您的服务disabled在启用后显示为。例如,尝试用替换default.target您的服务文件multi-user.target

(无法启用时未报告错误似乎是systemd中的缺陷。我几乎想知道您现在是否具有目录/etc/systemd/system/default.target.wants)。


journalctl命令告诉您发生了什么中断(例如,为什么启用失败。)对于链接,如果您创建自己的个人服务,则不需要此链接。如果你创建一个包这非常重要,你希望别人安装/删除等
亚历克西斯维尔克

@AlexisWilke那会更糟!为什么要编写它以将某些错误报告给stderr,将其他错误报告给日志?
sourcejedi

它将所有内容写入日志。从我所见,如果无法启动守护程序,则只会看到一个非常基本的,特定于systemd的错误。
亚历克西斯·威尔克

2
用户甚至没有报告基本错误,他们认为操作已成功,因此开始重新启动。从表面上看,systemd中存在缺陷。用户也有故障模式,但是在我看来,完全忽略一条错误消息是很有可能的。
sourcejedi '16

1
@sourcejedi我不知道你怎么知道的,但是是的,我现在在/etc/systemd/system/default.target.wants Inside内部有一个清单是我的服务文件。是的,我不知道有任何错误。
Startec

1

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

这是使用option完成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>

2
嗯,我删除了整行,没有任何改变。另外,(如我在问题中所说),通过运行systemctl start emacs可以正常启动。
Startec

看到我更新的问题。我有错字了Documentatin。您的提示对journalctl我有所帮助。
Startec '16

0

这是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 -bug-watchdogservice拒绝由于损坏的服务文件而开始/

分发级别修复是为了

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

有许多手动替代方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.