1

У меня есть скрипт в /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

Спасибо за помощь! Джефф

2 ответа2

4

В общем, ifup / ifdown не гарантирует, что ваш скрипт запускается только один раз. Таким образом, ваш сценарий должен быть идемпотентом; то есть содержать свою собственную логику, чтобы не создавать туннель, который уже существует. Конечно, лучший способ - запустить скрипт, фактически проверив, существует ли туннель:

# 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 , и в этот момент может быть слишком рано устанавливать туннель.

2

добавлять

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

к вашему сценарию.

В общем, для отладки подобных вещей сначала нужно сделать так, чтобы ваш скрипт состоял только из чего-то вроде

#!bin/sh
echo "$@" >/tmp/blah
set >>/tmp/blah

и проверить содержимое /tmp/blah после запуска сценария, чтобы получить общее представление о том, какие аргументы передается сценарию (если есть) и что он видит в своей среде при запуске.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .