저는 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.service
systemd 서비스 활성화 및 시작 :
# --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
인터페이스가 작동 중일 때만 wlo1
myconnection.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를 통해 더 많은 정보를 얻으세요네트워크 관리자.