on-failure riavvia gli errori, non SIGTERM. always riavvia anche l’uscita pulita, ma non uno systemctl stop. Il default è no. L’attesa default è 100 ms. Oneshot rifiuta always.
Restart=on-failure riavvia il servizio quando il processo esce male. Restart=always lo riavvia anche quando esce bene. Nessuno dei due scatta se a fermare l’unità è systemctl stop. Non è una probe HTTP: quella differenza è nella scheda su liveness e readiness. Rilettura del 14 ottobre 2026 sul manuale systemd.service del tag v257.
In breve: il default è no. Per un servizio che deve restare su, il manuale consiglia on-failure. SIGTERM è un’uscita pulita, quindi on-failure non riavvia. Type=oneshot rifiuta always e on-success. L’attesa prima del riavvio, se non la imposti, è 100 ms.
Cosa trovi in questo articolo
Il default e le sette parole
Fonte: man/systemd.service.xml del tag v257, voce Restart=, letta il 14 ottobre 2026. La stessa voce, nella pagina Debian bookworm di systemd.service(5), dice le stesse cose sulla scelta del valore. Non è la policy di riavvio di un container: quel manuale non la descrive, e questa scheda non la inventa.
Restart= decide se riavviare quando il processo del servizio esce, viene ucciso o scade un timeout. Il processo può essere il principale oppure uno di ExecStartPre=, ExecStartPost=, ExecStop=, ExecStopPost= o ExecReload=. Se a farlo morire è un’operazione di systemd (stop o restart del servizio), non viene riavviato. I timeout comprendono il watchdog e i timeout di start, reload e stop.
I valori sono no, on-success, on-failure, on-abnormal, on-watchdog, on-abort e always. no è il default: nessun riavvio. Il manuale indica on-failure come scelta consigliata per i servizi long-running. Se il servizio deve potersi chiudere da solo senza ripartire subito, l’alternativa scritta lì è on-abnormal.
La scheda è nel cluster Operatività.
Che cosa è un’uscita pulita
Uscita pulita, nel testo v257, significa una di queste: codice 0; per i tipi diversi da Type=oneshot, uno dei segnali SIGHUP, SIGINT, SIGTERM o SIGPIPE; oppure uno stato o un segnale elencato in SuccessExitStatus=. on-success riavvia solo in questi casi.
on-failure riavvia se il codice è diverso da zero, se arriva un segnale che non è uno di quei quattro (core dump compreso), se un’operazione va in timeout, o se scade il watchdog. Un processo che termina con SIGTERM non rientra. È il punto che si perde quando si legge «on-failure vuol dire ogni morte».
La matrice, senza abbreviarla
La tabella del manuale segna con una X i casi in cui quel valore riavvia. La colonna no è vuota su tutte le righe. Qui le X sono quelle del testo v257, non una sintesi.
| Causa di uscita | always | on-success | on-failure | on-abnormal | on-abort | on-watchdog |
|---|---|---|---|---|---|---|
| Uscita pulita (codice o segnale) | sì | sì | no | no | no | no |
| Codice non pulito | sì | no | sì | no | no | no |
| Segnale non pulito | sì | no | sì | sì | sì | no |
| Timeout | sì | no | sì | sì | no | no |
| Watchdog | sì | no | sì | sì | no | sì |
on-abort, in prosa, riavvia solo se il processo esce per un segnale non marcato come uscita pulita. on-watchdog solo se scade il watchdog. always riavvia sia sull’uscita pulita sia su segnale anomalo sia su timeout. Il codice non pulito non fa scattare on-abnormal: la riga della tabella è vuota, e la prosa di on-abnormal non cita il codice diverso da zero.
Stop, limiti, oneshot
Due eccezioni stanno sopra la tabella. Non si riavvia se il codice o il segnale è in RestartPreventExitStatus=, né se l’unità è fermata con systemctl stop o un’operazione equivalente. Si riavvia comunque se il codice o il segnale è in RestartForceExitStatus=. Il riavvio è anche soggetto al rate limit di StartLimitIntervalSec= e StartLimitBurst=, rimandati a systemd.unit(5).
Type=oneshot non viene mai riavviato su un’uscita pulita: always e on-success sono rifiutati. RestartSec= è l’attesa prima del riavvio. Nel v257 il default è 100 ms. RestartSteps= sale da RestartSec= verso RestartMaxDelaySec= solo se quest’ultimo è impostato; il default di RestartSteps= è 0, cioè disattivo.
Errori da evitare
Mettere
alwaysper «non perderlo» e poi stupirsi se un’uscita 0 lo rialza. È il comportamento scritto.Credere che
on-failureriavvii dopoSIGTERM. Quel segnale è pulito.Credere che
systemctl stopvenga contraddetto daalways. Lo stop di systemd non riavvia.Usare
alwayssu unType=oneshot. Il manuale lo rifiuta.Confondere questa chiave con una liveness probe. La probe non è
Restart=.
In sintesi
on-failure è il riavvio sugli errori, non su SIGTERM e non sullo stop. always include anche l’uscita pulita, salvo lo stop di systemd e salvo l’oneshot. Default no, attesa default 100 ms, consiglio del manuale per i long-running: on-failure. Verifica del 14 ottobre 2026 sul tag v257.
Copertina: Christopher Bowns, «Virginia Tech - data center», Wikimedia Commons, CC BY-SA 2.0. È una sala macchine vera, non un diagramma di systemd e non un test eseguito su quella sala.