Come scrivere un file .service di systemd che esegue systemd-tmpfiles


16

Ho bisogno di correre systemd-tmpfiles --create durante il processo di avvio con una distribuzione systemd. Quindi ho bisogno di creare un file systemd .service facendo questo lavoro.

In questa domanda puoi leggere tutti i dettagli su ciò di cui ho bisogno e perché: come funziona systemd-tmpfiles?

Ho letto alcuni documenti a riguardo e sto scrivendo il seguente test:

[Unit]
Description=Execute tmpfiles to disable usb-wakeup # see details in the link above
Requires=multi-user.target # see details in the link above
After=multi-user.target    # see details in the link above

[Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --create

[Install]
WantedBy=multi-user.target

Ma non sono sicuro, perché systemd-tmpfilesnon è un semplice programma ma un pezzo di sistema stesso. Non vorrei rompere il mio sistema.

Qualche consiglio su un file .service corretto?


Controlla la ricca documentazione su systemd su freedesktop.org/wiki/Software/systemd . È possibile ignorare le impostazioni predefinite del sistema con i propri file.
vonbrand,

Risposte:


30

[Questo non affronta direttamente il problema dei file systemd-tmp ma penso che tu abbia già riconosciuto che in questo caso particolare stai meglio usando solo l'eco.]

Innanzitutto, "multi-user.target" potrebbe essere o meno ciò che si desidera utilizzare. Se hai familiarità con il concetto di runlevel da init init in stile SysV, multi-user è l'equivalente di sistema di runlevel 3, che è un sistema multi-user che si avvia su una console, non su una GUI. L'equivalente di runlevel 5, che si avvia su X, è graphical.target . Il valore predefinito è determinato da un collegamento simbolico in /etc/systemd/system(e / o /lib/systemd/system; quello in /etcsovrascriverà quello in /lib) chiamato default.target , usa ls per trovare dove punta:

»ls -l /etc/systemd/system/default.target
default.target -> /usr/lib/systemd/system/multi-user.target

Per i normali desktop linux questo sarà graphical.target. Questo in realtà non è importante se vuoi che il servizio di avvio che stai creando venga avviato indipendentemente da quale sia il runlevel / target predefinito - in tal caso, possiamo semplicemente usare default.target e non preoccuparti di cosa sia un alias. Se si utilizza più utenti, tuttavia, e l'impostazione predefinita è grafica, il servizio non verrà eseguito.

A seconda del servizio, potrebbero esserci obiettivi o servizi più appropriati e specifici che si desidera avviare questo in relazione. Sulla base dell'altra tua domanda, default.target probabilmente va bene. Come nota, la differenza tra un "target" e un "servizio" è che un servizio contiene un[Service] sezione che esegue effettivamente un processo; un obiettivo è solo un modo di raggruppare i servizi attraverso le varie direttive "dipendenti" e "richiede"; non fa nulla di proprio oltre a innescare altri obiettivi o servizi.

L'avvio di un servizio è determinato da quali altri servizi dipendono esplicitamente da esso. Nel caso di un evento semplice e autonomo come questo che vogliamo eseguire in ritardo nel processo di avvio, possiamo usare questa combinazione di direttive:

[Unit]
After=default.target

[Install]
WantedBy=default.target

La sezione "Installa" viene utilizzata quando il servizio è installato; "WantedBy" specifica un target con cui si desidera includere questo servizio (il che significa che verrà eseguito se tale target lo fa, ma nb. Ciò non determina quando verrà eseguito in relazione ad altri ). Poiché in realtà vogliamo che questo servizio venga eseguito in un secondo momento anziché prima, quindi specifichiamo una clausola "Dopo". Questo in realtà non deve essere lo stesso del target WantedBy (di solito non lo è) e può essere completamente omesso se non ti interessa quando succede; Lo sto solo usando per il sospetto che la maggior parte delle altre cose verranno eseguite in relazione a cose che sono da qualche parte incatenate a qualcosa che ha specificatoBefore=default.target (che avremmo anche potuto usare; i desideri di un bersaglio vengono valutati prima che venga eseguito il bersaglio).

Per esempio, farò solo eco "ciao mondo" alla console. Il servizio stesso è descritto nella [Service]sezione:

[Service]
Type=forking
ExecStart=/usr/local/bin/helloworld

Il comando richiede un percorso completo. Il motivo per cui non ho semplicemente usato /usr/bin/echo "hello world"è che non funzionerà (l'output va a / dev / null, credo), e mentre un servizio fa echo "hello world" > /dev/consoletestamento, la sperimentazione dimostra che l'uso del reindirizzamento della shell in una direttiva ExecStart non funzionerà . Quindi, / usr / local / bin / helloworld è uno script di shell con quella linea uno, echo "hello world" > /dev/console.

Nota il Type=forking, che è necessario per uno script di shell.

Il nostro, file completo servizio minimo è solo quei tre sezioni ( [Unit], [Service], e [Install]). Per installare, posizionare il file o un link simbolico in / etc / systemd / system o / usr / lib / systemd / system e:

systemctl --system enable helloworld

Dovrebbe stampare ln -s ... . Questo non esegue il servizio, lo configura solo per l'avvio come discusso sopra.

In poche parole. man systemd.unite man systemd.serviceavere maggiori dettagli.


1
Grazie, risposta molto utile e problema risolto. Solo una nota, nella mia distro (Chakra Linux) default.targetnon è presente /etc/systemd/system, ma è solo in/usr/lib/systemd/system
eang

L'output dei comandi viene registrato (dove altro potrebbe andare)?
vonbrand,

I file / usr / lib / systemd / ... sono fallback (impostazione predefinita), dovresti rilasciare i tuoi in / etc / systemd / ...
vonbrand

In questi giorni default.targetsi trovano a/lib/systemd/system/default.target
czerasz il

1
@czerasz noto su Fedora 27, se systemctl set-default ...lascia un link simbolico /etc/systemd/system, ma non cambia quello in /lib, cioè, puntano a obiettivi diversi, ma roba nel primo dovrebbe prevalere sul secondo. Se l'hai impostato tu stesso, è quello che può succedere. Comunque, ho modificato in entrambe le posizioni.
Riccioli d'oro,

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.