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

仍然不完全理解我在做什麼,但現在它可以工作了。誰能解釋一下嗎?

更新

這個答案是在接受的答案出現之前由我自己創造的。

相關內容