O script em if-up.d parece estar em execução 3 vezes. Só quer que ele seja executado uma vez

1

Eu tenho um script em /etc/network/if-up.d para se conectar à minha VPN na inicialização. Parece que o script está sendo executado três vezes e, portanto, conectando-se à minha VPN três vezes. Após a inicialização, ver sudo ifconfig verifica se, na verdade, três túneis foram criados. Além disso, posso ver todos os três daemons openvpn ao observar a saída de ps aux . Como faço para garantir que seja executado apenas uma vez? E por que isso está acontecendo mais de uma vez? Eu estou executando o Debian 7.3.

O conteúdo de /etc/network/if-up.d/connectvpn é:

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

Obrigado pela sua ajuda! Jeff

    
por Jeff Erickson 31.12.2013 / 22:53

2 respostas

4

Em geral, ifup / ifdown não garante que seu script seja executado apenas uma vez. Assim, seu script tem que ser idempotente; isto é, contém sua própria lógica para não estabelecer um túnel que já existe. A melhor maneira, é claro, é iniciar o script verificando se o túnel já está lá:

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

Além disso, os scripts em if-up.d etc. são executados para cada interface criada. Como Jeff observa corretamente, os scripts if-*.d não recebem argumentos especificando, e. qual interface está chegando.

Em vez disso, na página de manual 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 ...]

A solução é iniciar o script com uma verificação do valor correto de IFACE , por exemplo:

# Exit if we're not starting "eth0".
[ "$IFACE" = 'eth0' ] || exit 0

Caso contrário, o script será executado para todos os dispositivos de rede, incluindo lo , quando poderá ser muito cedo para estabelecer um túnel.

    
por 17.04.2014 / 14:48
2

Adicionar

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

para o seu script.

Em geral, para depurar coisas como esta, é costume primeiro fazer com que seu script consista apenas em algo como

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

e inspecione o conteúdo de /tmp/blah depois que o script for executado para obter uma idéia aproximada de quais argumentos o script é passado (se houver) e o que ele vê em seu ambiente quando é executado.

    
por 07.01.2014 / 16:41