Systemd: come avviare un servizio systemd dopo che la rete è completamente connessa?


12

sfondo

Sto scrivendo un semplice script da eseguire in Raspbain su Raspberry Pi 2, accendere semplicemente un LED per indicare che sono pronto per connettermi con SSH dal mio computer desktop.

Lo script non è importante qui, solo per menzionare che mentre uso il controllo di frequenza, quindi lo script esegue un ciclo infinito, per accendere e spegnere il LED frequentemente. Quindi questo è un esempio di servizio semplice. Tuttavia, almeno la risposta accettata di questa domanda mi consiglia di impostare il tipo su inattivo. Quindi il mio file di servizio sembra

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

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

Effetto

Il servizio funziona come previsto. Tuttavia, ho notato che quando ho avviato putty sul mio computer desktop subito dopo l'accensione del LED, il prompt di accesso non è stato visualizzato immediatamente. Quindi ho verificato con

$ systemd-analyze plot > output.svg

Il risultato mostra

inserisci qui la descrizione dell'immagine

Domanda

Sembra che i miei servizi non inizino dopo network-online.target, cosa c'è che non va qui e come posso ripararlo?

Risposte:


12

Quando c'è una domanda su una direttiva systemd, puoi usare man systemd.directivesper trovare dove è documentata. In questo caso mostra che After=è documentato in man systemd.unit.

In quel file, mostra che la After=direttiva è elencata nelle "OPZIONI DI SEZIONE [UNIT]", indicando che appartiene alla [Unit]sezione del file.

La stessa documentazione documenta anche le opzioni della sezione [INSTALLA] e After=non è elencata qui.

In breve, la After=direttiva era nella posizione sbagliata del file dell'unità, quindi non ha avuto effetto fino a quando non è stata spostata nella posizione corretta.


Per essere chiari, in questo caso "[Unità]" è "[Servizio]", poiché è un file di servizio.
Faho,

Una risposta incollabile con le correzioni sarebbe stata molto migliore!
GerardJP

@GerardJP Meglio insegnare a un uomo a pescare che a dargli da mangiare per un giorno. Una volta che le persone sanno come utilizzare la documentazione di systemd, possono trovare risposte autorevoli senza perdere tempo su StackExchange guardando documenti di terze parti.
Mark Stosberg,

11

Risolvilo modificando il servizio come

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

Non ho ancora capito bene cosa stavo facendo, ma ora funziona. Qualcuno può spiegare?

Aggiornare

Questa risposta è stata creata da me prima che arrivi la risposta accettata.


Che la After=direttiva deve essere nella [Unit]sezione. È solo quello.
Bigon,
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.