Sous Windows, vous pouvez définir ce qui doit se produire si/quand un service échoue. Existe-t-il un moyen standard de réaliser la même chose sous Linux (CentOS en particulier)?
Une plus grande partie de ma question est: comment gérez-vous les sockets qui ont été laissées ouvertes - par exemple dans les états TIME_WAIT, FIN_WAIT1, etc.
Pour le moment, si le service que je développe tombe en panne, je dois attendre que les sockets soient effacées ou changer le port d'écoute avant de pouvoir ensuite le redémarrer manuellement.
Merci de votre aide.
monit
est un excellent moyen de surveiller et de redémarrer les services en cas d'échec - et vous finirez probablement par l'utiliser pour d'autres services essentiels (comme Apache). Il y a un Nice article sur nixCraft détaillant comment l'utiliser spécifiquement pour les services, bien que monit
lui-même ait beaucoup plus de fonctions au-delà.
En ce qui concerne l'aspect socket, @galraen a répondu à cet endroit.
Répondre uniquement à la partie redémarrage du service. J'ai également rencontré 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 si nécessaire:
[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 modifications 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/
Vous pouvez appeler setsockopt(2)
pour écouter la socket avec SO_REUSEADDR
, Vous pourrez donc bind(2)
à nouveau sans attendre l'expiration de toutes les connexions. Autre possibilité: supprimer les connexions du noyau. FreeBSD possède la commande tcpdrop
pour cela, je ne sais pas pour Linux.
Si votre distribution Linux utilise Upstart au lieu de SysV init, le mot clé respawn
le fait.