我有一个由 NetworkManager 管理的 ADSL (PPPoE) 连接。
它配置了自动连接和无限重试,但不幸的是 NM 并不完全可靠。有时连接失败,我必须先断开连接,然后再建立连接,然后才能再次工作。我制作了一个小脚本来自动执行此操作。
唯一的问题是当我想要保持连接时。在该脚本中,我需要检测管理员是否执行了此操作nmcli c adsl down
,在这种情况下,不要尝试重新启动。
我怎么能这么做呢?我比较了两种情况下的输出nmcli c show
,但没有发现任何有用的东西。我发现的唯一区别是 NM 调度程序pre-down
仅在手动关闭时才会被调用,但我不确定是否可以依赖这样的细节。
答案1
您可以使用一个包装脚本来处理网络上/下并将您的 keepalive 脚本放在那里:
#!/bin/bash
PIDFILE="/tmp/nmclihandler.pid"
#check if pid file exists
if [ -f "$PIDFILE" ]; then
#check if other process exists
if [ -d /proc/$(cat "$PIDFILE") ]; then
echo "killing other instance of script"
kill $(cat "$PIDFILE")
#remove pidfile if not
else
#echo "removing pidfile"
rm "$PIDFILE"
fi
fi
#write pid of current instance to file
echo "$$" > $PIDFILE
keepalive()
{
#put your current keepalive script here.
#It will be run if you pass the --run or -r parameter to the script
#or if you enable the interface via --up or -u
echo "keepalive"
}
#command help
if [ "$#" -eq 0 ] || [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
echo -e "nmcli helper script\n"
echo -e "Parameter Desciption\n"
echo "-h, --help show this help text"
echo "-d, --down disable interface"
echo "-u, --up enable interface"
echo "-r, --run keepalive connection"
exit 0
fi
#handle manual network up/down
if [ "$1" == "--down" ] || [ "$1" == "-d" ]; then
echo "disabling interface"
nmcli c down adsl
elif [ "$1" == "--up" ] || [ "$1" == "-u" ]; then
echo "enabling interface"
nmcli c up adsl
#run keepalive function after enabling network
elif [ "$1" == "--run" ] || [ "$1" == "-r" ]; then
#put your keepalive script here
keepalive
fi
--run
如果通过或适配器通过启用,包装器只会运行您的 keepalive 脚本--up
。如果--down
通过,网络连接将被禁用并且该keepalive()
函数将不会运行。
nmcli
请注意,这只是一种解决方法,如果直接调用并不能解决问题。