Systemd:ネットワークが完全に接続された後にsystemdサービスを開始する方法?


12

バックグラウンド

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ではなく開始されているようですが、ここで何が問題になっており、どのように修正できますか?

回答:


11

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

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

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

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


明らかに、この場合、「[Unit]」は「[Service]」です。これは、サービスファイルであるためです。
faho

修正したコピー貼り付け可能な答えははるかに優れていたでしょう!
GerardJP

@GerardJP男に魚を教えてから、1日間餌を与えることをお勧めします。systemdのドキュメントの使い方を知ったら、サードパーティのドキュメントを調べてStackExchangeに時間を費やすことなく、信頼できる回答を見つけることができます。
Mark Stosberg、

11

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

[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

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

更新

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


After=ディレクティブがでなければなりません[Unit]セクション。それだけです。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.