Soluzione 1:
Solo rispondendo alla parte di riavvio del servizio. Mi sono imbattuto anche in Monit, ma su CentOS 7 systemd si occupa di tutto questo per te. Devi solo aggiungere queste due righe al file .service (se non ci sono già):
Restart=always
RestartSec=3
Vedere https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ per riferimento.
Se vuoi creare un servizio systemd personalizzato, è abbastanza semplice scrivere il tuo file di servizio. Guarda l'esempio qui sotto, 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
Comunica a systemd le modifiche e avvia il servizio:
systemctl daemon-reload
systemctl start httpd
E ora puoi vedere lo stato:
systemctl status httpd
Per riferimento, vedere https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/
Soluzione 2:
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 descrive in dettaglio come usarlo per i servizi in particolare, anche se monit
stesso ha molte altre funzioni oltre a questo.
Per quanto riguarda l'aspetto del socket, @galraen ha risposto a questo punto.
Soluzione 3:
Puoi chiamare setsockopt(2)
per presa di ascolto con SO_REUSEADDR
, quindi sarai in grado di bind(2)
nuovamente senza attendere la scadenza di tutte le connessioni. Un'altra possibilità:eliminare le connessioni dal kernel. FreeBSD ha tcpdrop
comando per questo, non conosco Linux.
Soluzione 4:
Se la tua distribuzione Linux usa Upstart invece di SysV init, allora il respawn
parola chiave fa questo.
http://upstart.ubuntu.com/cookbook/#respawn