riavvio automatico del servizio systemd dopo StartLimitInterval


33

Voglio che il mio servizio systemd venga riavviato automaticamente in caso di errore. Inoltre, voglio limitare il limite dei riavvii. Voglio consentire un massimo di 3 riavvii entro 90 secondi. Quindi ho fatto la seguente configurazione.

[Servizio]
Riavvia = sempre
StartLimitInterval = 90
StartLimitBurst = 3

Ora il servizio viene riavviato in caso di errore. Dopo 3 guasti / riavvii rapidi, non si riavvia più come previsto. Ora mi aspettavo che il systemd avviasse il servizio dopo il timeout (StartLimitInterval). Ma il systemd non avvia automaticamente il servizio dopo il timeout (90 secondi), se riavvio manualmente il servizio dopo il timeout funziona. Ma voglio che systemd avvii automaticamente il servizio dopo StartLimitInterval. Per favore fatemi sapere come ottenere questa funzione.


3
Ho scritto un articolo che spiega come creare un servizio e come evitare questo particolare problema: la creazione di un servizio Linux con systemd .
Benjamin,

2
Penso che tu stia cercando StartLimitIntervalSec, no StartLimitInterval.
Marc Tamsky,

Risposte:


30

Per riavviare un servizio 3 volte a intervalli di 90 secondi, includere le seguenti righe nel file di servizio di systemd:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Questo ha funzionato per me per un servizio che esegue uno script usando 'Tipo = inattivo'. Notare che "StartLimitInterval" deve essere maggiore di "RestartSec * StartLimitBurst", altrimenti il ​​servizio verrà riavviato indefinitamente.

Mi ci è voluto un po 'di tempo con molte prove ed errori per capire come systemd utilizza queste opzioni, il che suggerisce che systemd non è così ben documentato come si potrebbe sperare. Queste opzioni forniscono in modo efficace il tempo di ciclo dei tentativi e i tentativi massimi che stavo cercando.


Questo dovrebbe essere contrassegnato come risposta accettata ...
Jeff

non riesco a trovare la StartLimitInterval=direttiva nel mio ultimo Ubuntu 18 ...
stoppino

10

Il comportamento che descrivi è coerente con la documentazione:

StartLimitInterval =, StartLimitBurst = Configura limitazione della frequenza di avvio del servizio. Per impostazione predefinita, i servizi che vengono avviati più di 5 volte entro 10 secondi non sono autorizzati ad avviarsi più volte fino al termine dell'intervallo di 10 secondi. Con queste due opzioni, questo limite di velocità può essere modificato. Utilizzare StartLimitInterval = per configurare l'intervallo di controllo (il valore predefinito è DefaultStartLimitInterval = nel file di configurazione del gestore, impostato su 0 per disabilitare qualsiasi tipo di limitazione della velocità). Utilizzare StartLimitBurst = per configurare il numero di avviamenti per intervallo consentiti (il valore predefinito è DefaultStartLimitBurst = nel file di configurazione del gestore). Queste opzioni di configurazione sono particolarmente utili insieme a Restart =; tuttavia, si applicano a tutti i tipi di avvio (incluso il manuale), non solo a quelli attivati ​​dalla logica Restart =.Si noti che le unità configurate per Restart = e che raggiungono il limite di avvio non vengono più tentate di essere riavviate; tuttavia, potrebbero essere riavviati manualmente in un secondo momento, da quel momento in poi la logica di riavvio verrà nuovamente attivata. Si noti che systemctl reset-fail causerà lo svuotamento del contatore della frequenza di riavvio di un servizio, il che è utile se l'amministratore desidera avviare manualmente un servizio e il limite di avvio interferisce con quello.

Sto ancora cercando di capire un modo per realizzare il comportamento che desideri.


Questo è più un commento che una risposta, come fai notare.
Dave M,

esattamente quello di cui avevo bisogno, ty
Some Linux Nerd

Secondo la documentazione che hai collegato, non dovrebbe essere StartLimitIntervalSec=(e DefaultStartLimitIntervalSec=)? Notare l'aggiunta di Secentrambi i nomi dei parametri.
Doktor J,

6

Alcuni anni dopo e con systemd 232 non funziona più come descritto nella domanda e nelle risposte dal 2016. Il nome dell'opzione StartLimitIntervalSece le sezioni sono cambiate. Ora deve assomigliare a questo esempio:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Ciò eseguirà 5 riavvii in 30 secondi (5 * 6) più un riavvio in 33 secondi. Quindi abbiamo 6 riavvii in 33 sec. Questo supera il limite di 5 riavvii in 33 secondi. Quindi i riavvii si fermeranno a 5 conteggi dopo circa 31 secondi.


1
Sembra che StartLimitIntervalsia ancora supportato, se non documentato, nella Servicesezione. Ma il nuovo, preferito StartLimitIntervalSecfunziona solo in Unit.
Danek Duvall, il


1

È possibile utilizzare StartLimitAction=reboot. Ciò riavvierà il sistema dopo StartLimitInterval.

StartLimitAction = Configura l'azione da eseguire se viene raggiunto il limite di velocità configurato con StartLimitInterval = e StartLimitBurst =. Prende uno di nessuno, riavvio, riavvio forzato o riavvio immediato. Se non è impostato nessuno, colpire il limite di velocità non attiverà alcuna azione oltre a che l'inizio non sarà permesso. il riavvio provoca un riavvio seguendo la normale procedura di arresto (ovvero equivalente al riavvio di systemctl). reboot-force provoca un riavvio forzato che interromperà forzatamente tutti i processi ma non dovrebbe causare file system sporchi al riavvio (ovvero equivalente a systemctl reboot -f) e riavvio-immediato provoca l'esecuzione immediata della chiamata di sistema reboot (2), che potrebbe risultare nella perdita di dati. Il valore predefinito è nessuno.

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.