Come riavviare automaticamente un servizio in caso di errore in Linux


23

Su Windows, puoi impostare cosa dovrebbe accadere se / quando un servizio fallisce. Esiste un modo standard per ottenere la stessa cosa su Linux (CentOS in particolare)?

Una parte più grande della mia domanda è: come gestite i socket che sono stati lasciati aperti, ad esempio negli stati TIME_WAIT, FIN_WAIT1, ecc.

Al momento, se il servizio che sto sviluppando si arresta in modo anomalo, devo attendere che i socket si cancellino o cambino la porta di ascolto prima di poterlo riavviare manualmente.

Grazie per l'aiuto.

Risposte:


26

monitè un ottimo modo per monitorare e riavviare i servizi quando falliscono - e probabilmente finirai per usarlo per altri servizi essenziali (come Apache). C'è un bell'articolo su nixCraft che spiega in dettaglio come usarlo per i servizi in particolare, anche monitse ha molte altre funzioni oltre a questo.

Per quanto riguarda l'aspetto socket, @galraen ha risposto a questo punto.


È un peccato che debba decidere qual è la risposta. Avrei dovuto porre due domande separate. @gelraen la tua risposta ha appena concluso le mie settimane di ricerca di una soluzione. Grazie voi così tanto! @Redmumba grazie, Monit ha un bell'aspetto!
Pryo,

Qualunque sia uno che si decide di marcare corretta, sicuramente upvote @ risposta di gelraen. La sua posizione è corretta e molto istruttiva.
Andrew M.

19

Rispondere solo alla parte di riavvio del servizio. Mi sono imbattuto anche in Monit, ma su CentOS 7 systemd si occupa di tutto ciò per te. Devi solo aggiungere queste due righe al file .service (se non sono già presenti):

Restart=always
RestartSec=3

Vedi https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ per riferimento.

Se si desidera creare un servizio systemd personalizzato, è abbastanza semplice scrivere il proprio file di servizio. Vedi l'esempio seguente, per un server http personalizzato.

Avvia l'editor con un nuovo file di servizio:

vim /etc/systemd/system/httpd.service

E aggiungi il seguente contenuto, che puoi modificare come richiesto:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Voglio che si avvii automaticamente all'avvio:

systemctl enable httpd

Informa systemd delle modifiche e avvia il servizio:

systemctl daemon-reload
systemctl start httpd

E ora puoi vedere lo stato:

systemctl status httpd

Per riferimento, consultare https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


Sì, esattamente, systemdil gestore del servizio standard sulle distribuzioni più popolari, può farlo per te.
Rolf

13

Puoi chiamare la setsockopt(2)presa di ascolto con SO_REUSEADDR, così sarai di bind(2)nuovo in grado di aspettare senza scadere tutte le connessioni. Un'altra possibilità: eliminare le connessioni dal kernel. FreeBSD ha il tcpdropcomando per questo, non so di Linux.


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.