Comment redémarrer automatiquement un service en cas d'échec sous Linux

23

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.

Pryo
la source

Réponses:

26

monitest 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 (tels que Apache). Il y a un bel article sur nixCraft détaillant comment l'utiliser spécifiquement pour les services, bien que monitlui-même ait beaucoup plus de fonctions au-delà.

En ce qui concerne l'aspect socket, @galraen a répondu à cet endroit.

Andrew M.
la source
C'est dommage que je doive décider quelle est la réponse. J'aurais dû poser deux questions distinctes. @gelraen votre réponse vient de mettre fin à mes semaines de recherche d'une solution. Merci vous si bien! @Redmumba merci, Monit a l'air bien!
Pryo
Quelle que soit celle que vous décidez de marquer comme correcte, votez certainement pour la réponse de @ gelraen. Son spot sur correct, et très instructif.
Andrew M.
19

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. Vous avez juste besoin d'ajouter ces deux lignes au fichier .service (si elles ne sont pas déjà là):

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/

Nagev
la source
Oui, exactement, systemdle gestionnaire de services standard sur les distributions les plus populaires peut le faire pour vous.
Rolf
13

Vous pouvez appeler la setsockopt(2)prise d'écoute avec SO_REUSEADDR, afin que vous puissiez le faire à bind(2)nouveau sans attendre l'expiration de toutes les connexions. Autre possibilité: supprimer les connexions du noyau. FreeBSD a une tcpdropcommande pour cela, je ne sais pas pour Linux.

gelraen
la source
4

Si votre distribution Linux utilise Upstart au lieu de SysV init, alors le respawnmot-clé le fait.

http://upstart.ubuntu.com/cookbook/#respawn

JeffG
la source
Merci, cela ressemble à la chose, mais malheureusement je suis coincé avec SysV init.
Pryo