Systemd: ネットワークが完全に接続された後に systemd サービスを開始するにはどうすればよいですか?

Systemd: ネットワークが完全に接続された後に systemd サービスを開始するにはどうすればよいですか?

背景

私は、Raspberry Pi 2 の Raspbain で実行する簡単なスクリプトを書いています。デスクトップ コンピューターから SSH で接続する準備ができていることを示すために、LED をオンにするだけです。

スクリプトはここでは重要ではありません。周波数制御を使用しているため、スクリプトは無限ループを実行し、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

まだ自分が何をしているのか完全には理解していませんでしたが、今は動作します。誰か説明してくれませんか?

アップデート

この回答は、承認された回答が来る前に私が作成したものです。

関連情報