Come si crea un servizio systemd come ultimo servizio all'avvio?


26

Molti anni fa, possiamo scrivere il nostro script di avvio in /etc/rc.local. Dopo aver caricato tutti i servizi di sistema, verrà eseguito lo script.

Ora usiamo systemd, non ne abbiamo rc.localpiù. Systemd avvia il servizio in parallelo. Puoi scrivere il tuo servizio per agire come rc.local` ma non puoi assicurarti che funzionerà dopo che tutti i servizi di sistema saranno caricati.

C'è un modo per farlo? Oppure dobbiamo usare Beforee Afternel file di servizio systemd?



5
Systemd, non Upstart !!
盖子 盖子

Specificare il nome e la versione del sistema operativo?
STTR


1
@ 比尔 盖子 Perché "last", non conosci le dipendenze dello script o vuoi che duri solo per sicurezza?
Paul

Risposte:


27

In systemd si consiglia di utilizzare Before=e After=ordinare i propri servizi in modo ottimale rispetto agli altri.

Ma dal momento che hai chiesto un modo senza usare Beforee After, puoi usare:

Type=idle

che come man systemd.servicespiega:

Il comportamento di idleè molto simile a simple; tuttavia, l'esecuzione effettiva del programma di servizio viene ritardata fino all'invio di tutti i lavori attivi. Questo può essere usato per evitare l'interlacciamento dell'output dei servizi shell con l'output di stato sulla console. Si noti che questo tipo è utile solo per migliorare l'output della console, non è utile come strumento di ordinazione di unità generali e l'effetto di questo tipo di servizio è soggetto a un timeout di 5 secondi, al termine del quale viene comunque richiamato il programma di servizio.


1
Ciao, ti andrebbe di elaborare la sintassi se avessi usato prima o dopo?
r4ccoon,

Argomento un po 'diverso, ma se qualcuno vuole eseguire processi utente separati dai processi di sistema, c'è askubuntu.com/a/859583/457417
Ben Creasy

funzionato perfettamente insieme /proc/sys/kernel/modules_disabledalla 1fine del processo di boot
Stuart Cardall

0

Dipende molto dalla tua definizione di "avvio". Presumo che tu voglia eseguirlo immediatamente dopo l'avvio di getty. Per fare ciò, è necessario aggiungere il servizio alla /etc/systemd/system/getty.target.wants/directory. Dovresti anche assicurarti che il tuo file stia usando un codice simile agli altri servizi in questa directory. Per eseguire un servizio personalizzato all'avvio e allo spegnimento (emette solo un segnale acustico sul cicalino della mia scheda madre), utilizzo il seguente script in/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh è eseguibile e ha uno shebang all'inizio.

Si noti che non tutto verrà avviato a questo punto nel boot, ma questo è il punto in cui il prompt di accesso appare all'utente

Anche se questo usa Before=e After=, per me è stato molto più comprensibile e funziona davvero; Non ho trovato la risposta sopra abbastanza istruttiva. Ciò consente inoltre di utilizzare entrambi ExecStart=e ExecStop=, anziché limitarsi a un Type=simpleservizio simile.


-2

Non ho familiarità con le specifiche o ArchLinux, ma ecco come gestire systemd in generale.

Bene, sostanzialmente systemd è una raccolta di script in /etc/init.d/ che sono indicati da collegamenti simbolici da /etc/rcX.d, dove X è il numero del livello di esecuzione. Gli stessi link simbolici hanno il seguente formato:

[K | S] + nn + [stringa]

dove:

  • nn è un numero che determina l'ordine in cui vengono eseguiti quegli script
  • stringa è il nome dello script come appare in /etc/init.d/
  • e infine K o S determinano il comando con cui viene invocato lo script: rispettivamente stop o start.

Pertanto, se si desidera che lo script venga eseguito per ultimo nella sequenza di avvio, è necessario eseguire le seguenti operazioni:

  1. inserisci il tuo script in /etc/init.d/ e rendilo eseguibile
  2. determinare il runlevel di destinazione da cui dovrebbe iniziare lo script (tipicamente 2 per console e 5 per interfaccia utente grafica). Può essere determinato con qualcosa del genererunlevel
  3. Dai un'occhiata a quali script sono già presenti in questo runlevel ls /etc/rc<target runlevel>.d/e scegli un numero di due cifre che è maggiore di qualsiasi altro già presente.
  4. usando un'utilità specifica per la tua distribuzione come update-rc.dper Debian o chkconfigper Fedora o manualmente, crea un link simbolico /etc/rc.d/S al tuo script init.

5
Quello che hai descritto è in realtà sysVinit. Sebbene sia vero che systemd sia compatibile con il funzionamento di sysVinit, esiste una differenza fondamentale: tutto viene eseguito in parallelo. Esistono anche due tipi di servizi, servizi sysVinit e servizi systemd. La tua risposta potrebbe aiutare a eseguire qualcosa dopo i servizi sysVinit, ma non necessariamente quelli di sistema.
Sam,

1
Systemd non punta a essere compatibile con sysvinit, fin dal primo giorno.
lzap,
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.