it-swarm-ja.com

if-up.dのスクリプトが3回実行されているようです。一度だけ実行したい

起動時にVPNに接続するためのスクリプトが/etc/network/if-up.dにあります。スクリプトが3回実行されているため、VPNに3回接続しているようです。起動後、Sudo ifconfigを見ると、実際に3つのトンネルが作成されていることが確認されます。また、ps auxからの出力を見ると、3つすべてのopenvpnデーモンを見ることができます。一度だけ実行するようにするにはどうすればよいですか?そして、なぜそれが複数回実行されているのですか? Debian7.3を実行しています。

/etc/network/if-up.d/connectvpnの内容は次のとおりです。

#!/bin/sh
/usr/sbin/openvpn --daemon --keepalive 5 30 --config /etc/openvpn/configs/bitterroot.conf

ご協力ありがとうございました!ジェフ

1
Jeff Erickson

一般に、ifup/ifdownは、スクリプトが1回だけ実行されることを保証するものではありません。したがって、スクリプトはべき等である必要があります。つまり、既存のトンネルを確立しない独自のロジックが含まれています。もちろん、最善の方法は、トンネルがすでに存在するかどうかを実際に確認してスクリプトを開始することです。

# Exit if network device "tun0" exists.
ip link show dev tun0 >/dev/null 2>&1 && exit 0

さらに、if-up.dなどのスクリプトは、起動されたすべてのインターフェイスに対して実行されます。ジェフが正しく観察しているように、if-*.dスクリプトは例を指定する引数を受け取りません。どのインターフェースが登場しますか。

代わりに、 interfaces(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を含むすべてのネットワークデバイスに対して実行され、その時点でトンネルを確立するには時期尚早である可能性があります。

4
Søren Løvborg

追加

if [ "$MODE" != start ]; then
        exit 0
fi

スクリプトに。

一般に、このようなものをデバッグするには、最初にスクリプトを次のようなものだけで構成するのが通例です。

#!bin/sh
echo "[email protected]" >/tmp/blah
set >>/tmp/blah

スクリプトの実行後に/tmp/blahの内容を調べて、スクリプトに渡される引数(存在する場合)と、実行時に環境で何が表示されるかを大まかに把握します。

2
kostix