背景
我正在编写一个简单的脚本,要在 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
仍然不完全理解我在做什么,但现在它可以工作了。谁能解释一下吗?
更新
这个答案是在接受的答案出现之前由我自己创建的。