Dlaczego polecenia post-up w / etc / network / interfaces były uruchamiane wiele razy podczas startu?

10

Oto treść /etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

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

I sshstartjest skryptem z następującymi elementami:

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

Gdy komputer uruchomi się ponownie, curlpolecenie jest wykonywane wielokrotnie, plik kończy się 2 lub 3 razy na serwerze ftp, a kiedy patrzę na procesy, wydaje się, że jest wiele wystąpień autossh uruchomionych ... Nie jestem pewien, czy w ten sposób autossh robi rzeczy lub nie, ale na pewno curl nie powinien przesyłać pliku wiele razy.

Mam przeczucie, że cały sshstartskrypt był uruchamiany wiele razy, ale nie rozumiem dlaczego.

Próbowałem szukać szczegółów na temat procesu konfiguracji sieci podczas rozruchu, ale jedyne, co mogłem znaleźć, to informacje o składni pliku interfejsów.

Czy ktoś może pomóc?

Dziękuję Ci.

--- Edytuj ---

Zgodnie z sugestią poniżej zmodyfikowałem plik interfejsów w następujący sposób (usunąłem puste linie powyżej post-up):

auto lo
iface lo inet loopback

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

I dodał następujący wiersz do sshstart:

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

Oto treść /run/shm/sshstart.logponownego uruchomienia:

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

Zostało to uruchomione 4 razy :( co się dzieje?

TCZ8
źródło
1
Wskazówka: lo ustawia if-up.d na true, a eth0 również ustawia na true. Post-up działa po ustawieniu każdego z nich. Twój skrypt musi zależeć tylko od jednego interfejsu, a nie od obu.
eyoung100
Pomyślałem, że to może być coś takiego, zgadnij jeszcze trochę czasu na RTFM.
TCZ8
Sprawdziłem i nie mogę znaleźć sposobu, aby określić, który adapter dla polecenia post-up wydaje się mieć coś wspólnego ze „zwrotką”, ale nie rozumiem tego dokładnie. strona interfejsów Debiana i Ubuntu zawiera sporo informacji, ale pominęła tę część.
TCZ8
1
Nie ma związku z pytaniem, ale BTW echo $(date)jest dość niezręczne i pośrednie. Równie dobrze może to przeliterować date. Podobne do nagrody za bezużyteczne wykorzystanie kota .
Celada
hahaha! masz absolutną rację! Nie mam pojęcia, dlaczego to zrobiłem: P
TCZ8

Odpowiedzi:

13

Pliki są /etc/network/if-up.d już uruchamiane automatycznie po pojawieniu się interfejsu (dowolnego interfejsu). Po określeniu, że ten sam skrypt ma być ponownie uruchamiany w jawnym post-uppoleceniu, powoduje to tylko ponowne uruchomienie skryptu. Domyślam się, że tak powinno się stać:

  • Działa raz, gdy lopojawi się (ze zmienną środowiskową IFACE=lo), ponieważ znajduje się w /etc/network/if-up.d.
  • Działa raz, gdy eth0pojawi się (ze zmienną środowiskową IFACE=eth0) z tego samego powodu.
  • Działa ponownie, gdy eth0pojawia się (z IFACEustawioną zmienną środowiskową ), ponieważ poprosiłeś o to w post-updyrektywie.

Nie jestem pewien, skąd pochodzi czwarty raz, ale w każdym razie to już trzy.

Musisz albo zlokalizować skrypt gdzieś indziej i uruchomić go raz przy użyciu post-updyrektywy, albo zostawić tam, gdzie jest, ale nie wspominaj o nim w post-updyrektywie i sprawdź wartość, $IFACEaby nic nie robiło, chyba że pojawi się żądany interfejs ( eth0) w górę.

Celada
źródło
OHH MAN! Wreszcie! masz całkowitą rację, właśnie dodałem wiersz do sshstart, aby echo $ IFACE w moim pliku dziennika było dokładnie takie, jak to opisałeś! Pierwszy raz to lo, drugi raz to eth0, trzeci to znowu eth0 (od post-upu), a czwarty czas nie jest tak jasny. Wartość $ IFACE przy czwartym razem to: - wszystko Nie wiesz, co to znaczy? Z ciekawości :)
TCZ8
1
Nie wiedziałam o tym --all. Wygląda na to, że istnieje funkcja, aby uruchomić if-up.dskrypty po raz ostatni z tym argumentem, aby zasygnalizować, że wszystkie interfejsy są już uruchomione, na wypadek, gdyby jakiś skrypt chciał podjąć działanie, gdy okaże się, że nie ma żadnych dalszych interfejsów. To wyjaśnia czwarty raz.
Celada
To ma sens, dziękuję za całą twoją pomoc!
TCZ8
3

Jak stwierdził Celada, /etc/network/if-up.dskrypty są uruchamiane dla każdego interfejsu. Aby uniknąć powielania reguł, po prostu dodaj:

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

u góry skryptu. Spowoduje to natychmiastowe zamknięcie skryptu, jeśli interfejs nie jest pożądany.

ppparadox
źródło
1

Usuń pustą linię przed post-uppoleceniem. To powinno odnosić post-upsię eth0tylko do polecenia . Dodatkowo przenieś skrypt z if-up.dfolderu. Skrypty w tym folderze są wykonywane automatycznie, bez względu na to, czy są zdefiniowane jako post-up. W twoim przypadku będzie działał dodatkowo do twojego post-uppolecenia.

xx4h
źródło
Nie działa, zobacz edycję w moim pytaniu.
TCZ8