Debian - jak uruchomić skrypt podczas uruchamiania, gdy tylko połączenie internetowe będzie gotowe do użycia?

14

Używam Debian 7 Wheezy i muszę uruchomić kilka ekranów przy starcie, jak tylko będzie w pełni funkcjonalne połączenie z Internetem. Jednak nie, jeśli połączenie internetowe uległo zerwaniu i zostało ponownie połączone. Tak więc tylko przy pierwszym funkcjonalnym połączeniu internetowym po uruchomieniu.

Czy mógłbyś napisać do tego fikcyjny skrypt i powiedzieć mi, gdzie go umieścić i aby został wykonany w podanych warunkach?

Skrypt musi tylko uruchomić ekran, a następnie zakończyć, ale ekran powinien być kontynuowany.


EDYCJA Słyszałem już o /etc/network/if-up.d/folderze. Ale jak mogę się upewnić, że skrypt nie zostanie ponownie wykonany, jeśli połączenie internetowe zostanie utracone, a następnie ponownie ustanowione?

MinecraftShamrock
źródło
@Celada zobacz edycję
MinecraftShamrock

Odpowiedzi:

21

Włóż skrypt /etc/network/if-up.di wykonaj go. Będzie uruchamiany automatycznie za każdym razem, gdy pojawi się interfejs sieciowy.

Aby działał tylko przy pierwszym uruchomieniu przy każdym uruchomieniu, sprawdź, czy plik flagi jest tworzony po raz pierwszy. Przykład:

#!/bin/sh

FLAGFILE=/var/run/work-was-already-done

case "$IFACE" in
    lo)
        # The loopback interface does not count.
        # only run when some other interface comes up
        exit 0
        ;;
    *)
        ;;
esac

if [ -e $FLAGFILE ]; then
    exit 0
else
    touch $FLAGFILE
fi

: here, do the real work.
Celada
źródło
Czy plik flag zostanie usunięty po wyłączeniu serwera?
MinecraftShamrock
1
Tak, ponieważ w Debianie /var/runjest niestabilny system plików (a tmpfs). Gwarantuje to, że przy każdym świeżym bucie będzie puste.
Celada,
1
Dobry chwyt Myślę, że musiałbyś mieć naprawdę pecha, ale myślę, że tak, z powodu podłączonych na gorąco interfejsów, które można wywoływać jednocześnie. Sądzę więc, że możesz to zrobić atomowo zamiast testować, a następnie tworzyć, co uczyniłoby to bezpiecznym, ale to, co wymyśliłem z czubka głowy, nie jest ładne! python -c 'import os; os.open("/var/run/work-was-already-done", os.O_EXCL|os.O_CREAT, 0)' 2>/dev/null || exit 0
Celada,
3
@MinecraftShamrock Jeśli używasz skryptu Celady w takim stanie, kod zostanie uruchomiony, gdy tylko pojawi się interfejs pętli zwrotnej. Jeśli chcesz poczekać na połączenie z Internetem, przynajmniej sprawdź, czy IFACEto nie jest lo- lub jakiś interfejs wirtualny - lub lepiej, przetestuj połączenie z Internetem za pomocą polecenia ping.
Gilles 'SO - przestań być zły'
1
@MinecraftShamrock $IFACEmoże mieć jako wartość każdy interfejs, który się pojawi. Możesz wyświetlić listę wszystkich istniejących interfejsów ip linklub sprawdzić, które z nich są skonfigurowane do uruchomienia przez skanowanie/etc/network/interfaces
Celada,
9

Jest to praca bardzo dobrze dostosowana systemd.

Uruchamianie skryptu jako usługi systemowej

Jeśli system działa systemd , możesz skonfigurować skrypt, aby działał jako usługa systemd, która zapewnia kontrolę nad cyklem życia i środowiskiem wykonawczym, a także warunki wstępne uruchomienia skryptu, takie jak sieć działająca.

Zalecanym folderem dla własnych usług jest /etc/systemd/system/(inna opcja jest /lib/systemd/systemtaka, ale zwykle powinna być używana tylko dla usług OOTB).

Utwórz plik np. Za pomocą sudo vim /etc/systemd/system/autossh.service:

[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target

[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody

# Useful during debugging; remove it once the service is working
StandardOutput=console

[Install]
WantedBy=multi-user.target

Teraz możesz przetestować usługę:

sudo systemctl start autossh

Sprawdzanie statusu usługi:

systemctl status autossh

Zatrzymywanie usługi:

sudo systemctl stop autossh

Po sprawdzeniu, że usługa działa zgodnie z oczekiwaniami, włącz ją za pomocą:

sudo systemctl enable autossh

UWAGA: Ze względów bezpieczeństwa systemdskrypt będzie uruchamiany w ograniczonym środowisku, podobnie do sposobu crontaburuchamiania skryptów, dlatego nie przyjmuj żadnych założeń dotyczących wcześniej istniejących zmiennych systemowych, takich jak $ PATH. Użyj Environmentklawiszy, jeśli skrypt wymaga zdefiniowania określonych zmiennych. Dodanie set -xu góry skryptu bash, a następnie uruchomienie systemctl status my_servicemoże pomóc w określeniu przyczyny niepowodzenia skryptu. Z reguły tumb, zawsze używaj ścieżek bezwzględnych do wszystkiego, w tym echolub jawnie zdefiniuj swoją $ PATH poprzez dodanie Environment=MYVAR=abc.

ccpizza
źródło
2

Połączenie internetowe jest /etc/rc6.d/prawdopodobnie wywoływane przez wpis w S35networking. Jeśli zmienisz ten plik i wstawisz polecenia na końcu, lub lepiej dodasz do niego /etc/init.d/mystufflink /etc/rc0.d/S36mystuffi i wstawisz tam swoje polecenia, to rozpocznie się, gdy tylko sieć się uruchomi.

Anthon
źródło
Czy zostanie wywołane, jeśli połączenie zostanie utracone, a następnie ponownie ustanowione? Ponieważ w przeciwnym razie mógłbym po prostu umieścić skrypt w/etc/network/if-up.d
MinecraftShamrock
Nie, to tylko na starcie
Anthon
1
To zadziała, ale tylko dla poprawności pozwolę sobie /etc/rc0.dzauważyć , że żaden skrypt nie będzie uruchamiany podczas uruchamiania, będą one uruchamiane podczas zamykania (poziom uruchamiania 0). Podczas uruchamiania będzie to coś /etc/rc2.dpodobnego lub podobnego. Specjalnie dla wheezzy OP Debiana /etc/rcS.d/S12networking. Oczywiście wszystkie dowiązania symboliczne do tego samego pliku. Również BTW @Anthon dziękuję za ustalenie mojej odpowiedzi: „Proszę” zamiast „Put”? Co za dziwna literówka!
Celada,
@Celada Masz rację, to rc6 na moim systemie (innym niż Debian). Nie byłam pewna, czy chcesz tam „Proszę umieścić”, ale po prostu „Umieść” wydawało się bardziej chrupiące. BTW Poparłem twoją odpowiedź, jest to po prostu lepsze podejście do sieci, ponieważ ma to if-up.djako ogólny mechanizm, który działa również przy ponownym połączeniu.
Anthon