ネットワークが変更されると、システムデバイスは自動的に再起動します。

ネットワークが変更されると、システムデバイスは自動的に再起動します。

私はPythonスクリプトを使用してリモートサーバーへのいくつかの接続を確立しています。これは私の単位です:

[Unit]
Description=...
After=network.target

[Service]
ExecStart=/usr/bin/python...
WorkingDirectory=/home/matej/...
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root

[Install]
WantedBy=multi-user.target

これはうまくいきますが、ネットワークが変更された場合(たとえば、WiFiの変更、WiFiの電源を入れ直してから電源を入れ、ラップトップをスリープ状態にした後に再起動...)、接続をリセットするにはこのスクリプトを再起動する必要があります。

現在は、ネットワークが変更されるたびに手動で実行する必要があります(sudo systemctl restart myconnection.service)。

ところで、これを自動的に処理するオプションがあるか?これに役立ちますか?

ベストアンサー1

あなたが持っているので、NetworkManager.serviceあなたも持っている必要がありNetworkManager-dispatcher.service、したがってルートがあります/etc/NetworkManager/dispatcher.d/
接続が確立されたタイミングを検出するために実行できるタスク戻るまたは下にNetworkManager-dispatcher.servicesystemdサービスの有効化と起動:

# --enable now: will enable and start the service at once
sudo systemctl enable --now NetworkManager-dispatcher.service

ネットワークインタフェースの状態を確認するスクリプトを生成する前に、システムで利用可能なネットワークインタフェースを取得する必要があります。ip aまたは、以下を使用してifconfig取得できます。

$> ip a
#Output:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a8:93:4a:8f:03:11 brd ff:ff:ff:ff:ff:ff
    altname wlp1s0
    inet 192.168.1.71/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1
       valid_lft 85690sec preferred_lft 85690sec
    inet6 2806:103e:6:de14:89d9:530c:bc20:bb44/64 scope global temporary dynamic 
       valid_lft 86070sec preferred_lft 85199sec
    inet6 2806:103e:6:de14:35f7:328a:206f:9d72/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 86070sec preferred_lft 86070sec
    inet6 fe80::744b:40fb:f14a:99ea/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

上から分かるように、私はループバックインターフェースそしてWlo1インターフェースwlo1無線接続だから使います。

これで、ネットワークインターフェイスを使用している必要があります/etc/NetworkManager/dispatcher.d/。スクリプトを呼び出すと10-python-dispatcher.shシェル(シェン)スクリプト。与えることを忘れないでください実装する次のスクリプト権限:chmod +x 10-python-dispatcher.sh

wlo1インターフェイスが動作中または停止している場合は、myconnection.serviceが再起動されます。

#/bin/sh

# Scripts under '/etc/NetworkManager/dispatcher.d/' will have 
# two arguments ($1 and $2) which belong to the device or network interface
# and its status.

DEVICE=${1}
STATE=${2}

if [ "$DEVICE" = "wlo1" ]; then
 
   if [ "$STATE" = "up" -o "$STATE" = "down" ]; then
      systemctl restart myconnection.service
   fi
fi

インターフェイスが動作している場合にのみwlo1myconnection.service を再起動します。

#/bin/sh

DEVICE=${1}
STATE=${2}

if [ "$DEVICE" = "wlo1" ]; then
 
   if [ "$STATE" = "up" ]; then
      systemctl restart myconnection.service
   fi
fi

インターフェイスが開いているか閉じているかに関係なく、すべてのネットワークインターフェイスで動作するように上記のスクリプトを調整できます。

メモ:スクリプトを生成したら、/etc/NetworkManager/dispatcher.d/次のコマンドを実行してスケジューラが現在の変更で実行されていることを確認することをお勧めします。

sudo systemctl daemon-reload
sudo systemctl restart NetworkManager-dispatcher.service

あなたは見ることができますこのウェブサイトArch Wikiでより多くの情報を得るネットワーク管理者

おすすめ記事