2015-06-25 17 views

risposta

18

Sì, è possibile effettuare il servizio per riavviarlo periodicamente effettuando il servizio di Type=notify. Aggiungi questa opzione nella sezione [Servizio] del tuo file di servizio insieme a Restart=always e inserisci WatchdogSec=xx, dove xx è il periodo di tempo in secondi per il quale desideri riavviare il servizio. Qui il tuo processo verrà ucciso da systemd dopo il periodo di tempo xx e verrà riavviato di nuovo da systemd. per es.

[Unit] 
. 
. 

[Service] 
Type=notify 
. 
. 
WatchdogSec=10 
Restart=always 
. 
. 

[Install] 
WantedBy= .... 
+4

Intelligente! FWIW 'type = notify' non è necessario per il mio stupido servizio legacy che si disconnette dopo un po '. L'impostazione di 'WatchdogSec' con' Type = simple' funziona allo stesso modo, però. – wes

+4

Il problema con '' WatchdogSec'' è che invierà un SIGABRT (che provoca un core dump) ogni volta che si riavvia. Oltre a terminare in modo impuro il processo, potrebbe anche riempire il tuo disco di root con i coredumps. – bk0

+1

grazie, 'Type = notify' non stava facendo partire il servizio per me,' Type = 'simple' funziona alla grande (in realtà senza' Type' funziona bene, probabilmente semplice è il 'Type' predefinito) – WonderLand

3

Solo alcuni approcci alternativi per raggiungere in ultima analisi, lo stesso obiettivo:

  • se si dispone di controllo dell'esecuzione del servizio si potrebbe fare a finire volontariamente dopo un po ', ad esempio, sia normale uscire dopo un certo numero di iterazioni (se applicabile) o utilizzando un timer di timeout con un gestore che invia un SIGTERM/SIGKILL
  • se il termine del servizio volontario non è fattibile/pratico si potrebbe avere un piccolo script basato su cron che uccide il/i processo/i di servizio.
16

Ho visto una soluzione here che sembrava elegante, anche se un po 'rotonda. L'idea chiave è quella di creare un servizio one-shot attivato da un timer che riavvia il servizio .

Per il timer:

[Unit] 
Description=Do something daily 

[Timer] 
OnCalendar=daily 
Persistent=true 

[Install] 
WantedBy=timer.target 

Per il servizio one-shot:

[Unit] 
Description=Restart service 

[Service] 
Type=oneshot 
ExecStart=/usr/bin/systemctl try-restart my_program.service 

Per il servizio one-shot su Ubuntu 16.04 LTS:

[Unit] 
Description=Restart service 

[Service] 
Type=oneshot 
ExecStart=/bin/systemctl try-restart my_program.service 

Questa soluzione consente si sfruttano i timer di systemd, inclusa la possibilità di riavviare il servizio in una particolare ora del giorno e non solo dopo alcuni è trascorso del tempo.

+3

I ' m confuso su come il timer giornaliero chiama il servizio one-shot qui? – svandragt

+2

Non sono sicuro se questo è quello che stai chiedendo, ma, nel migliore dei casi, il servizio one-shot ha un timer associato, e il lavoro di questo servizio one-shot è quello di riavviare un altro servizio . Credo che questo sia ottenuto semplicemente nominando il servizio e il suo timer associato con lo stesso nome, cioè, 'weeklyRestart.service' e' weeklyRestart.timer'. Quando ho risolto questo problema, ho analizzato uno _lot_ di collegamenti. Inviami un messaggio e io posso inviarti un dump di link. – matmat

+3

@svandragt Questo è esattamente come funziona.Un timer systemd deve avere lo stesso nome del servizio che sta iniziando. –