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

Ear*_*ine 14 startup systemd

背景

我正在编写一个要在 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
Run Code Online (Sandbox Code Playgroud)

影响

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

$ systemd-analyze plot > output.svg
Run Code Online (Sandbox Code Playgroud)

结果显示

在此处输入图片说明

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

Mar*_*erg 18

当有关于 systemd 指令的问题时,您可以使用man systemd.directives它来查找记录的位置。在这种情况下,它显示After=记录在man systemd.unit.

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

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

简而言之,您的After=指令位于单元文件的错误位置,因此在您将其移动到正确位置之前它不起作用。

  • 带有更正的可复制粘贴答案会更好! (3认同)
  • @GerardJP 最好教一个人钓鱼然后喂他一天。一旦人们知道如何使用 systemd 文档,他们就可以找到权威的答案,而无需花时间在 StackExchange 上查看第三方文档。 (2认同)

Ear*_*ine 13

通过将服务修改为

[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
Run Code Online (Sandbox Code Playgroud)

仍然没有完全理解我在做什么,但它现在有效。谁能解释一下?

更新

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