我正在使用 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
它将是一个 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 获取更多信息网络管理器。