Por que os comandos de postagem no / etc / network / interfaces são executados várias vezes na inicialização?

10

Aqui está o conteúdo de /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

post-up /etc/network/if-up.d/sshstart

E sshstarté um script com o seguinte:

curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 [email protected] -p 8080

Quando a máquina é reinicializada, o curlcomando é executado várias vezes, o arquivo termina 2 ou 3 vezes no servidor ftp e, quando olho para os processos, parece que há várias instâncias de execução automática ... Não tenho certeza se é assim autossh faz as coisas ou não, mas com certeza o curl não deve carregar o arquivo várias vezes.

Meu palpite é que o sshstartscript inteiro é executado várias vezes, mas não entendo o porquê.

Tentei procurar detalhes sobre o processo de configuração da rede na inicialização, mas tudo o que pude encontrar foram informações de sintaxe para o arquivo de interfaces.

Alguém pode ajudar por favor?

Obrigado.

--- Editar ---

Como sugerido abaixo, modifiquei meu arquivo de interfaces da seguinte forma (removemos as linhas vazias acima da postagem):

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart

E adicionou a seguinte linha ao sshstart:

echo $(date)>>/run/shm/sshstart.log

Aqui está o conteúdo de /run/shm/sshstart.logapós uma reinicialização:

Wed Oct 29 08:07:00 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014
Wed Oct 29 08:07:07 EDT 2014

Por isso, foi executado 4 vezes :( o que está acontecendo?

TCZ8
fonte
1
Dica: lo define if-up.d como true e eth0 também define como true. O pós-up é executado depois que cada um é definido. Seu script precisa depender apenas de uma interface, não de ambas.
eyoung100
Eu pensei que poderia ser algo assim, acho que é hora de RTFM um pouco mais.
TCZ8
Eu verifiquei e não consigo descobrir como especificar qual adaptador para o comando de postagem, parece ter algo a ver com uma "estrofe", mas não entendi exatamente. a página de interfaces Debian e Ubuntu tem muitas informações, mas elas pularam essa parte.
TCZ8
1
Não está relacionado à questão, mas o BTW echo $(date)é meio estranho e indireto. Poderia muito bem soletrar isso como date. Semelhante ao Prêmio Uso Inútil do Gato .
Celada
hahaha! você está absolutamente certo! Eu não tenho idéia do por que fiz isso: P
TCZ8

Respostas:

13

Os arquivos /etc/network/if-up.d já são executados automaticamente sempre que uma interface (qualquer interface) é exibida. Ao especificar o mesmo script para executar novamente em um post-upcomando explícito , você faz com que o script seja executado novamente. Então, acho que é isso que deve acontecer:

  • É executado uma vez quando losurge (com variável de ambiente IFACE=lo) devido à localização /etc/network/if-up.d.
  • É executado uma vez quando eth0surge (com variável de ambiente IFACE=eth0) pelo mesmo motivo.
  • É executado novamente quando eth0surge (com a variável de ambiente IFACEnão definida) porque você solicitou isso em uma post-updiretiva.

Não sei de onde vem a quarta vez, mas de qualquer maneira já são três.

Você precisa localizar o script em outro lugar e executá-lo uma vez usando uma post-updiretiva ou deixá-lo onde está, mas não o mencione em uma post-updiretiva e verifique o valor de $IFACEpara que ele não faça nada, a menos que a interface desejada ( eth0) tenha chegado acima.

Celada
fonte
OHH, HOMEM! Finalmente! você está absolutamente certo, acabei de adicionar uma linha ao sshstart para fazer eco do $ IFACE no meu arquivo de log e é exatamente como você o descreveu! A primeira vez é lo, a segunda vez é eth0, a terceira é eth0 novamente (do post-up) e a quarta vez não é tão clara .. O valor do $ IFACE na quarta vez é: --todos você não saberia o que isso significa? Apenas por curiosidade :)
TCZ8
1
Eu não sabia --all. Parece que há um recurso para executar os if-up.dscripts pela última vez com esse argumento para sinalizar que todas as interfaces estão ativadas, caso algum script queira executar uma ação, uma vez que se saiba que não há outras interfaces pendentes. Isso explica a quarta vez.
Celada 29/10
Isso faz sentido, obrigado por toda a sua ajuda!
TCZ8
3

Conforme declarado pela Celada, os /etc/network/if-up.dscripts são executados para cada interface. Para evitar a duplicação de regras, basta adicionar:

[ "$IFACE" = "eth0" ] || exit 0

no topo do seu script. Isso fará com que o script saia imediatamente se a interface não for a desejada.

ppparadox
fonte
1

Exclua a linha vazia antes do post-upcomando. Isso deve relacionar o post-upcomando eth0apenas. Além disso, mova seu script para fora da if-up.dpasta. Os scripts nessa pasta são executados automaticamente, independentemente de serem definidos como post-up. No seu caso, ele será executado adicionalmente ao seu post-upcomando.

xx4h
fonte
Não está funcionando, veja a edição na minha pergunta.
TCZ8