「ip Route show」が私のスクリプトのシステムサービスから出力を生成しない理由

「ip Route show」が私のスクリプトのシステムサービスから出力を生成しない理由

提供しています。

[Unit]
Description=testing
Requires=network-online.target
After=NetworkManager.service

[Service]
SyslogIdentifier=testing
Type=oneshot
ExecStart=test.sh

[Install]
WantedBy=network-online.target

テスト.sh...

#!/usr/bin/env bash
nmcli connection up router.wired
echo ***
nmcli connection show
echo ***
ip route show

出力..

testing[779]: Connection successfully activated (D-Bus active path: /org/freedesktop/Network>
testing[772]: ***
testing[1468]: NAME          UUID  TYPE      DEVICE
testing[1468]: router.wired  xxxx  ethernet  enp1s0
testing[1468]: router        xxxx  wifi      --
testing[772]: ***

ip route show接続が確立されても出力が表示されないのはなぜですか?電話なしでどのようにこれを行うことができますかnmcli connection up

スクリプトからそれをインポートすると、nmcli connection upシステムはとにかくその接続で起動します。この時点で、手動でサービスを呼び出し、デフォルトsudo service test startゲートウェイを含む期待される結果を得ることができます。ip route show

満足のいく解決策...

問題は、システムが起動する順序のようです。起動時にサービスを無効にし、代わりにタイマーデバイスを使用して有効にしようとしましたが、正常に動作しOnBootSec=50ました。私は成功せずnetwork.targetnetwork-online.target可能なすべての依存関係を試しましたNetworkManager.service

答え1

私の考えでは、ip routeそれが早すぎると終了し、systemd-journaldがそれが属するデバイスを正しく検出しなかったようです。調査するグローバル journalctl -b必要な出力があることを確認してください。 (これは既知の問題です。)

また、しかし:

  1. Requires=意味ではないAfter=ため、サービスは実際にnetwork-online.targetに到達するのを待ちません。はっきり言わなければなりませんAfter=network-online.target

    (依存関係が表示されたらAfter =を意味します。~から対象ですが、他の状況ではそうではありません。 )

  2. systemd-networkd-wait-onlineデフォルトでは、network-online.targetは実際には空です。たとえば、またはあなたの場合に適切な「待機」サービスを有効にすることはあなた次第ですNetworkManager-wait-online。後者が有効になっていることを確認してください。それ以外の場合、ターゲットは何もしません。

  3. あなたの一方、サービスは次のようにする必要があります。いいえに入ることはWantedBy=network-online.target目標の目的ではありません。

関連情報