web-dev-qa-db-ja.com

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がログインをオンにした直後にデスクトップコンピューターでPuTTYを起動すると、すぐに表示されないことに気付きました。だから私はチェックしました

$ systemd-analyze plot > output.svg

結果は

enter image description here

質問

サービスがnetwork-online.targetの後に開始されていないようですが、ここで何が問題になっていて、どうすれば修正できますか?

12
Earth Engine

Systemdディレクティブに関する質問がある場合は、man systemd.directivesを使用して、ドキュメント化されている場所を見つけることができます。この場合は、After=man systemd.unitに記述されていることを示しています。

そのファイルでは、After=ディレクティブが[[UNIT] SECTION OPTIONS]にリストされており、ファイルの[Unit]セクションに属していることを示しています。

同じドキュメントには[INSTALL]セクションのオプションも記載されており、After=はそこにはリストされていません。

つまり、After=ディレクティブはユニットファイルの間違った場所にあったため、正しい場所に移動するまで効果がありませんでした。

12
Mark Stosberg

サービスを次のように変更して修正してください

[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

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

更新

この回答は、受け入れられた回答が来る前に自分で作成したものです。

11
Earth Engine