if-up.d 中的脚本似乎运行了 3 次。只希望它运行一次

if-up.d 中的脚本似乎运行了 3 次。只希望它运行一次

我有一个脚本,用于/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,以大致了解脚本传递了哪些参数(如果有)以及运行时在其环境中看到的内容。

相关内容