GNU/Linux >> Linux Esercitazione >  >> Linux

Causa Uno script da eseguire dopo l'avvio della rete?

Sono relativamente nuovo in Systemd e sto imparando la sua architettura.

In questo momento, sto cercando di capire come eseguire uno script di shell personalizzato. Questo script deve essere eseguito dopo il livello di rete è stato avviato.

Sto eseguendo Arch, utilizzando sia systemd che netctl.

Per testare, ho scritto un semplice script che esegue semplicemente ip addr list > /tmp/ip.txt . Ho creato il seguente file di servizio per questo script.

(/etc/systemd/system/test.service)
[Unit]
Description=test service

[Service]
ExecStart=/root/test.script

[Install]
WantedBy=multi-user.target

Ho quindi abilitato lo script con,

systemctl enable test

Al riavvio, lo script viene effettivamente eseguito, ma viene eseguito prima dell'avvio della rete. In altre parole, l'output in ip.txt non visualizza alcun indirizzo IPv4 assegnato all'interfaccia primaria. Al momento dell'accesso, l'indirizzo IPv4 è stato effettivamente assegnato e la rete è attiva.

Immagino di poter alterare il punto in cui lo script viene eseguito scherzando con WantedBy parametro, ma non sono sicuro di come farlo.

Qualcuno potrebbe indicarmi la giusta direzione?

Risposta accettata:

Sulle dipendenze di configurazione della rete di sistema

È molto facile influenzare l'ordinamento delle unità di systemd. D'altra parte devi stare attento a ciò che garantisce un'unità completata.

Configura il tuo servizio

Sui sistemi attuali,
ordina dopo network.target garantisce solo che il servizio di rete sia stato avviato, non che ci sia una configurazione effettiva. Devi ordinare dopo network-online.target e tiralo dentro per ottenerlo.

[Unit]
Wants=network-online.target
After=network-online.target

Per la compatibilità con i sistemi precedenti, potrebbe essere necessario ordinare anche dopo network.target.

[Unit]
Wants=network-online.target
After=network.target network-online.target

Questo è per il file di unità del tuo servizio e per systemd.

Implementazione nelle versioni correnti del software

Ora devi assicurarti che network-online.target funziona come previsto (o che almeno puoi utilizzare network.target ).

La versione corrente di NetworkManager offre il NetworkManager-wait-online.service che viene inserito da network-online.target e quindi al tuo servizio. Questo servizio speciale garantisce che il tuo servizio attenda fino a quando tutte le connessioni configurate per essere avviate automaticamente hanno esito positivo, negativo o scaduto.

La versione corrente di systemd-networkd blocca il servizio fino a quando tutti i dispositivi non sono configurati come richiesto. È più semplice in quanto attualmente supporta solo le configurazioni che vengono applicate all'avvio (più specificamente l'ora di avvio di `systemd-networkd.service).

Per completezza, il /etc/init.d/network servizio in Fedora, come interpretato dalle versioni correnti di systemd, blocca network.target e quindi blocca indirettamente network-online.target e il tuo servizio È un esempio di implementazione basata su script.

Se la tua implementazione, basata su daemon o basata su script, si comporta come uno dei servizi di gestione della rete di cui sopra, ritarderà l'avvio del servizio fino a quando la configurazione della rete non viene completata correttamente, non riesce per una buona ragione o scade dopo un tempo ragionevole fotogramma da completare.

Correlati:cercare file i cui percorsi contengono più parole senza un ordine specifico tra di loro?

Potresti voler controllare se netctl funziona allo stesso modo e quell'informazione sarebbe un'aggiunta preziosa a questa risposta.

Implementazioni in versioni precedenti del software

Non credo che vedrai una versione sufficientemente vecchia di systemd in cui questo non funzionerebbe bene. Ma puoi verificarlo almeno network-online.target esiste e che viene ordinato dopo network.target .

In precedenza NetworkManager garantito solo che almeno una connessione sarebbe stata applicata. E anche per farlo funzionare, dovresti abilitare il NetworkManager-wait-online.service esplicitamente. Questo problema è stato risolto a lungo in Fedora, ma è stato applicato solo di recente a monte.

systemctl enable NetworkManager-wait-online.service

Note sulle implementazioni network.target e network-online.target

Non dovresti mai aver bisogno di fare in modo che il tuo software dipenda da NetworkManager.service o NetworkManager-wait-online.service né altri servizi specifici. Invece, tutti i servizi di gestione della rete dovrebbero ordinarsi prima di network.target e facoltativamente network-online.target .

Un semplice servizio di gestione della rete basato su script dovrebbe completare la configurazione della rete prima di uscire e dovrebbe ordinarsi prima di network.target e quindi indirettamente prima di network-online.target .

[Unit]
Before=network.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Un servizio di gestione della rete basato su daemon dovrebbe anche ordinarsi prima di network.target anche se non è molto utile.

[Unit]
Before=network.target

[Service]
Type=simple
ExecStart=...

Un servizio che attende il completamento del demone dovrebbe ordinarsi dopo il servizio specifico e prima di network-online.target . Dovrebbe usare Requisite sul servizio demone in modo che si interrompa immediatamente se il rispettivo servizio di gestione della rete non viene utilizzato.

[Unit]
Requisite=...
After=...
Before=network-online.target

[Service]
Type=oneshot
ExecStart=...
RemainAfterExit=yes

Il pacchetto dovrebbe installare un collegamento simbolico al servizio in attesa nel wants directory per network-online.target in modo che venga richiamato dai servizi che desiderano attendere la rete configurata.

ln -s /usr/lib/systemd/system/... /usr/lib/systemd/system/network-online.target.wants/

Documentazione correlata

  • http://www.freedesktop.org/software/systemd/man/systemd.special.html#network-online.target
  • http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

Note finali

Spero non solo di aver aiutato a rispondere alla tua domanda nel momento in cui l'hai posta, ma anche di aver contribuito a migliorare la situazione nelle distribuzioni upstream e Linux, in modo da poter ora dare una risposta migliore di quella possibile al momento della stesura di quella originale .


Linux
  1. Esegui lo script php come processo daemon

  2. Script Ruby come servizio

  3. Esegue lo script bash dall'URL

  4. Impossibile su all'utente jenkins dopo aver installato Jenkins

  5. Esegui lo script bash come demone

Iniziare con systemctl

Come eseguire lo script della shell come servizio SystemD in Linux

Come eseguire un comando in uno script della shell?

Centos 7:Per iniziare

Esegui lo script bash dopo il login

Systemd:come eseguire lo script solo allo spegnimento (non al riavvio)