web-dev-qa-db-ja.com

Debian systemd network-online.targetが機能していませんか?

Debian Jessieでsystemdサービスを作成しようとしています。 network-online.targetに達した後に開始する必要があります。

問題はnetwork-online.targetnetwork.targetと同時に発生し、その時点でインターフェイスがまだ構成されていないため、DHCPクエリを開始しただけです。

レガシーネットワーク構成を使用しているため、この問題はDebianに固有のようです。

この問題を回避する方法またはnetwork-online.targetを機能させる方法

24
10robinho

_/etc/network/interfaces_を使用しているため、各インターフェースのステータスを監視するにはsystemdサービスが必要です。 _/lib/systemd/system/ifup-wait-all-auto.service_(Ubuntu 15.04のifupdownパッケージによってインストール)があるかどうかを確認します。そうでない場合は、_/etc/systemd/system/ifup-wait-all-auto.service_を作成し、以下を貼り付けます。

_[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target
_

これは、Ubuntu 15.04システムに存在するサービスファイルですが、少し簡単にするために_[Install]_セクションが追加されています。 Ubuntu 15.04でのifupの動作がDebian Jessieでのifupの動作と同じであることを期待しています。そうでない場合、いくつかの変更が必要になります(特に最後の行で)。

次に、_Sudo systemctl enable ifup-wait-all-auto.service_を実行します。コンピュータを再起動した後、インターフェイスが起動した後、少なくとも_network-online.target_に到達したことを確認してください。

18
saiarcot895

私はかつて Githubの回答 を見つけました。 pingが通過した場合にのみ、サービスは継続します。

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

交換しましたgoogle.com自分のサーバーに接続する必要があるのは、メインスクリプトが私のサーバーに接続するためです。

0
Sam

あたり https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ サービスを開始するための推奨される方法[〜#〜]後[〜#〜] = networking is level is to use "network-online.target" in 。serviceファイル:

 "After=network-online.target"
 "Wants=network-online.target"

しかし、「network-online.target "を使用した後、ネットワークが完全にレベルに達していないためにサービスが失敗し、バグがあることを発見しました( https://github.com/coreos/bugs/issues/1966 )これを使用すると、100%間違いがないことが保証されません。

実際、この場合のように "NetworkManager"などの動的ネットワーク構成ツールが使用される場合、ネットワークの状態が100%正確または予測可能になることはありません。 。明らかに、バグを説明しているリンクから、「network-online.target "は、それが使用されているさまざまなアプリケーションによっては、一貫性のない動作をする可能性があります。

回避策
サービスの起動順序を分析し、 "network-online.target"より後に開始するサービスを使用する必要があります:

 systemd-analyze plot > /home/pi/graph.svg

これは反復的なプロセスであり、ネットワークを確実に安定させ、エラーなしでサービスを開始できるサービスが見つかるまで、ターゲットを後のサービスに段階的に変更します。私自身の場合、sleep 10スクリプトでSystemDサービスが呼び出しました。

0
F1Linux

注意! Raspbian Jessieでそれを理解しただけです:/ etc/networkインターフェースのすべてのコメント行を削除すれば動作します!解析バグのようです=)私の特定のケースでは、コメントを残しましたiface eth0 inet dhcpそして何十年も前にそれを忘れていましたが、Raspbian Jessieにアップグレードしてカーネルを再構築した後、私は非常に奇妙な動作をしました。DHCPを使用し、/ etc/network/interfacesからのチューニングを拒否しました。だから私はコメントからそれを取り除いた-ちょうど働く行、再起動-そしてそれは動作します!スクリプトのパッチ/編集は必要ありません!

0
Alexey Vesnin