Systemd:网络完全连接后如何使Systemd服务启动?


12

背景

我正在编写一个简单的脚本,使其在Raspberry Pi 2上的Raspbain中运行,只需打开一个LED灯,以指示我准备从台式计算机连接SSH。

该脚本在这里并不重要,只不过要提到,由于我使用了频率控制,因此该脚本正在运行一个无限循环,可以频繁地打开和关闭LED。因此,这是简单服务的示例。但是,至少该问题的可接受答案建议我将类型设置为空闲。所以我的服务档案看起来像

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

影响

该服务将按预期运行。但是,我注意到当LED亮起后,立即在台式计算机上启动腻子时,登录提示不会立即出现。所以我检查了

$ systemd-analyze plot > output.svg

结果显示

在此处输入图片说明

看来我的服务没有在之后启动network-online.target,这是什么问题,我该如何解决?

Answers:


12

如果对systemd指令存在疑问,则可以使用man systemd.directives它来查找记录在哪里。在这种情况下,它显示After=在中man systemd.unit

在该文件中,它表明该After=伪指令在“ [UNIT] SECTION OPTIONS”中列出,表明该伪指令属于[Unit]文件的这一部分。

同一文档还记录了[INSTALL]部分的选项,并且After=未在此处列出。

简而言之,您的After=指令将单元文件放在错误的位置,因此直到将其移动到正确的位置之前,它才有效。


为了清楚起见,在这种情况下,“ [Unit]”是“ [Service]”,因为它是服务文件。
faho

带有更正的可复制粘贴答案会更好!
GerardJP

@GerardJP最好教一个人钓鱼然后喂他一天。一旦人们知道如何使用systemd文档,他们就可以找到权威的答案,而无需花费时间在StackExchange上查看第三方文档。
马克·斯托斯伯格

11

通过将服务修改为

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

仍然不完全了解我在做什么,但是现在可以了。谁能解释一下?

更新资料

这个答案是我自己在接受的答案出现之前创建的。


After=指令必须在该[Unit]部分中。就是这样
Bigon
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.