网络变化时 Systemd 单元自动重启

网络变化时 Systemd 单元自动重启

我正在使用 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 aifconfig来获得:

$> 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它将是一个 shell () 脚本。别忘了给予执行脚本的权限,如: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 获取更多信息网络管理器

相关内容