Solution 1 :
Ne répondant qu'à la partie de redémarrage du service. Je suis également tombé sur Monit, mais sur CentOS 7, systemd s'occupe de tout cela pour vous. Il vous suffit d'ajouter ces deux lignes au fichier .service (si elles n'y sont pas déjà) :
Restart=always
RestartSec=3
Voir https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ pour référence.
Si vous souhaitez créer un service systemd personnalisé, il est assez simple d'écrire votre propre fichier de service. Voir l'exemple ci-dessous, pour un serveur http personnalisé.
Démarrez l'éditeur avec un nouveau fichier de service :
vim /etc/systemd/system/httpd.service
Et ajoutez le contenu suivant, que vous pouvez modifier selon vos besoins :
[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
Je veux qu'il démarre automatiquement au démarrage :
systemctl enable httpd
Informez systemd des changements et démarrez le service :
systemctl daemon-reload
systemctl start httpd
Et maintenant vous pouvez voir le statut :
systemctl status httpd
Pour référence, voir https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/
Solution 2 :
monit
est un excellent moyen de surveiller et de redémarrer les services lorsqu'ils échouent - et vous finirez probablement par l'utiliser pour d'autres services essentiels (tels qu'Apache). Il y a un bel article sur nixCraft détaillant comment l'utiliser spécifiquement pour les services, bien que monit
lui-même a beaucoup plus de fonctions au-delà de cela.
En ce qui concerne l'aspect socket, @galraen a répondu présent.
Solution 3 :
Vous pouvez appeler le setsockopt(2)
pour prise d'écoute avec SO_REUSEADDR
, vous pourrez donc bind(2)
recommencez sans attendre l'expiration de toutes les connexions. Autre possibilité :supprimer les connexions du noyau. FreeBSD a tcpdrop
commande pour cela, je ne connais pas Linux.
Solution 4 :
Si votre distribution Linux utilise Upstart au lieu de SysV init, alors le respawn
le mot-clé fait cela.
http://upstart.ubuntu.com/cookbook/#respawn