Debian - come eseguire uno script all'avvio non appena è disponibile una connessione Internet?


14

Sto eseguendo Debian 7 Wheezy e devo avviare alcune schermate all'avvio non appena è disponibile una connessione Internet completamente funzionale. Tuttavia, no, se la connessione Internet si interrompesse e fosse nuovamente connessa. Quindi solo sulla prima connessione Internet funzionale dopo l'avvio.

Potresti per favore pubblicare un copione fittizio per questo e dirmi dove metterlo e farlo eseguire alle condizioni indicate?

Lo script deve solo avviare lo schermo e quindi terminare, ma lo schermo dovrebbe continuare.


EDIT Ho già sentito parlare della /etc/network/if-up.d/cartella. Ma come posso assicurarmi che lo script non venga eseguito di nuovo se la connessione a Internet viene persa e poi ristabilita?


@Celada, per favore, vedi la modifica
MinecraftShamrock,

Risposte:


21

Inserisci il tuo script /etc/network/if-up.de rendilo eseguibile. Verrà eseguito automaticamente ogni volta che viene visualizzata un'interfaccia di rete.

Per farlo funzionare solo la prima volta che viene eseguito ad ogni avvio, è necessario verificare l'esistenza di un file flag che si crea dopo la prima volta. Esempio:

#!/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.

Il file flag verrà eliminato all'arresto del server?
MinecraftShamrock,

1
Sì, perché su Debian /var/runè un file system volatile (a tmpfs). Quindi è garantito che rimanga vuoto ad ogni nuovo avvio.
Celada,

1
Buona pesca. Penso che dovresti essere davvero sfortunato, ma penso di sì, a causa delle interfacce collegate a caldo che potrebbero essere visualizzate contemporaneamente. Quindi immagino che tu possa farlo atomicamente invece di test-then-create, il che lo renderebbe sicuro, ma quello che mi è venuto fuori dalla cima della mia testa non è carino! 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 Se si utilizza lo script di Celada così com'è, il codice verrà eseguito non appena viene visualizzata l'interfaccia di loopback. Se si desidera attendere la connettività Internet, almeno verificare che IFACEnon sia lo- o qualche interfaccia virtuale - o meglio, testare la connettività Internet eseguendo il ping.
Gilles 'SO- smetti di essere malvagio' il

1
@MinecraftShamrock $IFACEpuò avere come valori qualsiasi interfaccia che si presenta. Puoi elencare tutte le interfacce esistenti ip linko vedere quali sono configurate per essere visualizzate mediante scansione/etc/network/interfaces
Celada,

9

Questo è un lavoro molto adatto per systemd.

Esecuzione di uno script come servizio systemd

Se il tuo sistema esegue systemd , puoi configurare lo script in modo che venga eseguito come un servizio systemd che fornisca il controllo del ciclo di vita e dell'ambiente di esecuzione, nonché le condizioni preliminari per l'avvio dello script, come ad esempio la rete in esecuzione.

La cartella consigliata per i propri servizi è /etc/systemd/system/(un'altra opzione è /lib/systemd/systemche normalmente dovrebbe essere utilizzata solo per i servizi OOTB).

Crea il file ad es. Con 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

Ora puoi testare il servizio:

sudo systemctl start autossh

Verifica dello stato del servizio:

systemctl status autossh

Interruzione del servizio:

sudo systemctl stop autossh

Dopo aver verificato che il servizio funziona come previsto, abilitarlo con:

sudo systemctl enable autossh

NOTA: per motivi di sicurezza, systemdlo script verrà eseguito in un ambiente limitato, in modo simile a come crontabvengono eseguiti gli script, quindi non fare ipotesi su variabili di sistema preesistenti come $ PATH. Utilizzare le Environmentchiavi se lo script necessita di variabili specifiche da definire. L'aggiunta set -xnella parte superiore dello script bash e quindi l'esecuzione systemctl status my_servicepotrebbe aiutare a identificare il motivo per cui lo script non riesce. Come regola di tumb, usa sempre percorsi assoluti per tutto ciò che include echoo definisci esplicitamente $ PATH aggiungendo Environment=MYVAR=abc.


2

La connessione a Internet è /etc/rc6.d/probabilmente causata da una voce S35networking. Se si modifica quel file e si inseriscono i comandi alla fine, o meglio si aggiunge /etc/init.d/mystuffe si collega /etc/rc0.d/S36mystuffad esso e si inseriscono i comandi lì, allora inizierà non appena la rete è attiva.


Verrà chiamato se la connessione viene persa e poi ristabilita? Perché altrimenti potrei semplicemente mettere la sceneggiatura in/etc/network/if-up.d
MinecraftShamrock

No, questo è solo all'avvio
Anthon,

1
Funzionerà, ma solo per correttezza lasciatemi sottolineare che nessuno script in /etc/rc0.dverrà eseguito all'avvio, quelli verranno eseguiti allo spegnimento (eseguire il livello 0). All'avvio sarebbe qualcosa /etc/rc2.do simile. In particolare per il respiro sibilante di Debian dell'OP, lo è /etc/rcS.d/S12networking. Ovviamente tutto si collega allo stesso file. Inoltre BTW @Anthon grazie per aver risolto la mia risposta: "Per favore" invece di "Put"? Che strano errore di battitura!
Celada,

@Celada Il tuo diritto è rc6 sul mio (sistema non Debian). Non ero sicuro che tu volessi "Ti preghiamo di metterlo" lì, ma solo "Put" sembrava più croccante. A proposito ho votato a favore della tua risposta, è solo un approccio migliore per il networking in quanto ha quel if-up.dmeccanismo generico che funziona anche su una riconnessione.
Anthon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.