我有以下 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
有许多手动替代方案。