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

影響

サービスが期待どおりに実行されます。ところで、デスクトップコンピュータでパテを起動したときにLEDが点灯した直後にログインプロンプトが表示されないことがわかりました。だから確認してみた

$ systemd-analyze plot > output.svg

結果を示す

ここに画像の説明を入力してください。

質問

私のサービスは後で開始されないようですnetwork-online.target。ここで何が間違っていて、どのように解決できますか?

答え1

systemdディレクティブが疑わしい場合は、それを使用して、man systemd.directivesそのディレクティブがどこに記録されているかを判断できます。この場合はAfter=man systemd.unit

ファイル内のディレクティブが「[UNIT] SECTION OPTIONS」にリストされており、そのディレクティブがファイルのセクションAfter=に属していることを示します。[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

まだ私がしていることを完全に理解していませんが、今はうまくいきます。誰でもこれを説明できますか?

修正する

この回答は、許可された回答が表示される前に直接作成されました。

関連情報