Aggiunta del ritardo tra l'arresto e l'avvio di un processo in systemd


10

Ho un problema davvero strano con systemd. Quando emetto un systemctl restart, inizierà il nuovo processo prima che quello precedente finisca.

Questo può essere visto nel registro, dove il messaggio di arresto finale ("registro di chiusura") viene registrato dopo il messaggio di avvio ("registro di apertura").

C'è un modo per aggiungere un ritardo tra l'arresto e l'inizio del processo?


Nulla ti impedisce di correresystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti,

Perché è strano? È una funzionalità di progettazione che ti lascia in pace per risolvere i problemi del mondo reale. Iniettare il sonno all'avvio dell'unità o utilizzare una condizione ExecPre per assicurarsi che la vecchia istanza sia completamente scomparsa.
Florian Heigl,

Risposte:


13

Nei file di servizio del sistema, è possibile impostare l'opzione RestartSec per aggiungere un ritardo per il riavvio. Vedi l'esempio seguente:

[Service]
Restart=always
RestartSec=30

Controlla questo link per altri esempi.


1
afaik RestartSecsi applica solo ai servizi configurati con la Restart=direttiva e non viene preso in considerazione quando si fa unsystemctl restart someservice
don_crissti

1

RestartSec sembra essere utilizzato solo se quel particolare servizio è quello che viene riavviato tramite il comando di riavvio di systemctl.

Ad esempio, ho due servizi, A e B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

e

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Se esegui un riavvio del sistema B, funziona come previsto ... ma se esegui un riavvio del sistema A, entrambi i servizi vengono arrestati e riavviati immediatamente, senza ritardi.

Apparentemente Systemd utilizza solo i valori di configurazione per l'unico servizio specificato e li ignora per eventuali dipendenze.

Questo non è così raro come sembra. Se B comunica con un server remoto, l'avvio e l'arresto rapidi potrebbero non riuscire a causa del rifiuto remoto del client. Ma riavviare direttamente A avverrà ogni volta che A viene aggiornato senza una modifica a B.

Probabilmente puoi aggirare questo aggiungendo anche il ritardo ad A, ma non dovresti farlo, poiché rompe l'isolamento degli oggetti facendo conoscere A a B quando non è una dipendenza.

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.