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

Systemd:如何在网络完全连接后启动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

影响

该服务按预期运行。然而,我注意到,当我在台式电脑上启动 putty 时,LED 亮起后,登录提示不会立即出现。所以我检查了

$ systemd-analyze plot > output.svg

结果显示

在此输入图像描述

问题

看来我的服务不是在 之后启动的network-online.target,这里出了什么问题,我该如何修复它?

答案1

当对 systemd 指令有疑问时,您可以使用 来man systemd.directives查找它的记录位置。在本例中,它显示After=记录在man systemd.unit.

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

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

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

答案2

通过将服务修改为来修复它

[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

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

更新

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

相关内容