我有一个脚本,用于/etc/network/if-up.d
在启动时连接到我的 VPN。看来该脚本运行了三次,因此连接到我的 VPN 三次。启动后,查看可以sudo ifconfig
验证实际上已经创建了三个隧道。此外,查看的输出时,我可以看到所有三个 openvpn 守护进程ps aux
。我如何确保它只运行一次?为什么它运行不止一次?我正在运行 Debian 7.3。
其内容/etc/network/if-up.d/connectvpn
为:
#!/bin/sh
/usr/sbin/openvpn --daemon --keepalive 5 30 --config /etc/openvpn/configs/bitterroot.conf
谢谢你的帮助!杰夫
答案1
一般来说,ifup
/ifdown
不能保证您的脚本只运行一次。因此,您的脚本必须是幂等的;也就是说,包含自己的逻辑,不建立已经存在的隧道。当然,最好的方法是通过实际检查隧道是否已经存在来启动脚本:
# Exit if network device "tun0" exists.
ip link show dev tun0 >/dev/null 2>&1 && exit 0
此外,etc. 中的脚本if-up.d
针对每个启动的接口运行。正如 Jeff 正确观察到的那样,if-*.d
脚本没有接收任何参数来指定启动哪个接口。
相反,根据接口(5)手册页:
There exists for each of the above mentioned options a directory
/etc/network/if-<option>.d/ [...]
All of these commands have access to the following environment vari‐
ables.
IFACE physical name of the interface being processed
LOGICAL
logical name of the interface being processed
[... and more ...]
解决方案是启动脚本并检查是否正确IFACE
,例如:
# Exit if we're not starting "eth0".
[ "$IFACE" = 'eth0' ] || exit 0
否则,该脚本将针对每个网络设备运行,包括lo
,此时建立隧道可能为时过早。
答案2
添加
if [ "$MODE" != start ]; then
exit 0
fi
到你的脚本。
一般来说,为了调试这类东西,通常首先让你的脚本只包含类似
#!bin/sh
echo "$@" >/tmp/blah
set >>/tmp/blah
并检查脚本运行后的内容/tmp/blah
,以大致了解脚本传递了哪些参数(如果有)以及运行时在其环境中看到的内容。