Domanda:
Esecuzione di uno script dopo aver stabilito una connessione Internet
user8951490
2018-02-08 22:54:03 UTC
view on stackexchange narkive permalink

Sto cercando di eseguire uno script python molto piccolo DOPO che Internet è stato stabilito. Attualmente sto modificando /etc/network/if-up.d/upstart aggiungendo il seguente codice direttamente sotto all_interfaces_up():

  all_interfaces_up () {python /path/to/script.py # restituisce true se tutte le interfacce elencate in / etc / network / interfaces come 'auto' # sono attive. se non vengono trovate interfacce, allora "all [data] erano attive" prefisso locale = "$ 1" iface = "" per iface in $ (get_auto_interfaces); do # se l'interfaccia cur non è attiva, allora non sono state attivate tutte [-f "$ {prefix} $ {iface}"] || return 1 done return 0}  

So che il programma "script.py" funziona, perché l'ho testato numerose volte. Ho solo bisogno che funzioni DOPO che la connessione a Internet è stata stabilita.

Ho provato il codice precedente con e senza il "python" che precede il percorso dello script.

Mi sono anche assicurato che #! path / to / python fosse all'inizio del mio file .py.

Inoltre, ho fatto chmod + x per renderlo eseguibile.

Cosa mi manca? Ho riavviato il mio Pi ogni volta che ho provato qualcosa di nuovo e ho eseguito il codice service networking restart per assicurarmi che la rete venga riavviata. Perché il mio script non viene eseguito dopo che è stata stabilita la connessione a Internet?

Non è chiaro quale Raspbian stai utilizzando o come è configurata la tua rete. Mentre questo file è presente, l'attuale Raspbian ** NON ** usa la rete Debian. Dovresti provare un servizio `systemd`.
Due risposte:
#1
+18
Ingo
2018-02-10 02:34:38 UTC
view on stackexchange narkive permalink

Come ha commentato @Milliways, qui è dove entra in gioco la potenza di systemd . Non è necessario attendere che i comandi elaborati sequenziali siano terminati. systemd funziona in parallelo (questo è ciò che rende un po 'insolito). Può avviare i servizi dopo l'avvio di altri servizi. Poiché questa "cosa di rete" è un problema molto comune, abbiamo un bel servizio chiamato network-online.target . Ora è molto semplice avviare your_script.py dopo network-online.target.

Facciamolo con my_script.sh codice> come modello. Puoi sostituirlo con your_script.py . Uso Raspbian Lite da debian stretch .

Crea my_script.sh e provalo:

  pi ~ $ cdpi ~ $ cat > my_script.sh <<EOF #! / bin / bashecho "ciao mondo" >> / tmp / mio_script.outEOFpi ~ $ chmod u + x mio_script.shript / $ mio_script.shpi outhello worldpi ~ $  

Ora crea un nuovo servizio per my_script.sh:

  pi ~ $ sudo systemctl edit - force --full my_script.service  

Inserisci queste istruzioni con le tue impostazioni, salvale ed esci dall'editor:

  [Unit] Description = My Script ServiceWants = network-online.targetAfter = network-online.target [Service] Type = simpleUser = piWorkingDirectory = / home / piExecStart = / home / pi / my_script.sh [Install] WantedBy = multi-user.target  

Controlla il nuovo servizio:

  pi ~ $ systemctl status my_script.service ● my_script.service - Il mio servizio script caricato: caricato (/etc/systemd/system/my_script.servic e; Disabilitato; vendor preset: enabled) Active: inactive (dead)  

Ora possiamo abilitare e testare il nostro servizio:

  pi ~ $ sudo systemctl enable my_script.servicepi ~ $ sudo systemctl avvia my_script.servicepi ~ $ sudo systemctl avvia my_script.servicepi ~ $ cat /tmp/my_script.outhello world ciao mondo ciao mondo
pi ~ $ sudo systemctl reboot  

Accedi e controlla. La directory / tmp è stata ripulita all'avvio.

  pi ~ $ cat /tmp/my_script.outhello worldpi ~ $  

Puoi modificare il file delle unità e mostrarlo. Dopo la modifica è necessario riavviare il servizio per avere effetto.

  pi ~ $ sudo systemctl edit --full my_script.servicepi ~ $ sudo systemctl riavvia my_script.servicepi ~ $ systemctl cat my_script.service  

Per verificare che tutti i dispositivi di rete siano veramente attivi, modifica my_script.sh in questo modo, riavvia e guarda /tmp/my_script.out :

  pi ~ $ cat > my_script.sh <<EOF #! / bin / bash / bin / ip addr > / tmp / mio_script.outEOFpi ~ $ sudo systemctl reboot  


riferimento:
[1] man systemd.unit

Wow, grazie per il resoconto dettagliato! Posso vedere che il mio script funziona quando eseguo `sudo systemctl start my-script.sh` ma non altrimenti. Questo mi porta a credere che il servizio non si avvii automaticamente al riavvio o che lo script sia in esecuzione prima che venga stabilita la connessione a Internet.
Ho omesso la riga "Wants" e ora sembra funzionare. Grazie ancora per la risposta dettagliata.
Sì, `Wants = network-online.target` significa" Lo voglio ora ". Altrimenti viene caricato solo quando desidera altri servizi. Questo è mentre funziona con `sudo systemctl start my-script.sh`. Al momento dell'avvio è stato caricato troppo tardi per lo script da un altro servizio.
Ho dovuto inserire "WantedBy = network-online.service" nella sezione "[Install]", per farlo funzionare.
#2
  0
Chad G
2018-02-09 01:17:28 UTC
view on stackexchange narkive permalink

Stai eseguendo lo script all'inizio della funzione all_interfaces_up ()

Questa funzione verrà eseguita anche se non sono attive, nota i due valori di ritorno

Tu potrebbe fare in modo che il tuo script controlli la connessione e aspettare finché non ne ha uno, quindi esegui il resto del codice

  def Connected (): controlla qui se la rete è attiva se non Connected (): time.sleep (5 ) restofcode ....  

allora non importa se la connessione viene subito o meno, il tuo codice aspetterà finché non lo farà, quindi eseguirà il corpo principale del codice



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...