네트워크가 변경되면 시스템 장치가 자동으로 다시 시작됩니다.

네트워크가 변경되면 시스템 장치가 자동으로 다시 시작됩니다.

저는 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를 통해 더 많은 정보를 얻으세요네트워크 관리자.

관련 정보