Comment surveiller un service et redémarrer s'il est arrêté sous Linux

24

En fait, je ne suis pas sûr de savoir si je dois utiliser des scripts shell ou s'il existe déjà des moyens. Mais quelle que soit l'approche que nous utilisons, je voudrais que le service fonctionne tout le temps.

Disons par iptablesexemple. Ensuite ..

  • Chaque fois que le iptablesservice est stoppedou (en d'autres termes) ne fonctionne pas, je veux qu'il soit started(ou restarted) .. automatiquement chaque fois qu'il s'arrête (ou ne fonctionne pas).
  • En d'autres termes plus simples, je veux maintenir un service opérationnel tout le temps.

(Peut-être que je pourrais donner une fréquence correcte pour vérifier, si la vérification en temps réel est le problème. Disons donc, toutes les 5 minutes)

La seule façon dont je pouvais penser, est d'utiliser des scripts Shell avec Cron Tab.

  • Y a-t-il une solution intelligente s'il vous plaît?

Merci!

夏 期 劇場
la source
Tu ne devrais pas faire ça. Supposons qu'un service soit mal configuré, quelle serait votre stratégie? Une liste infinie de nouveaux procès. Vous devriez à la place écrire un script crontab que alertsvous avez sur quelque chose qui ne fonctionne pas.
MariusMatutiae
Je suis simplement curieux de savoir la solution directe, pour la question d'origine. Et aussi, j'ai un service qui doit être simplement à restartedchaque fois qu'il s'arrête, pour une raison quelconque. Pas de problème de redémarrage.
夏 期 劇場
1
Votre propre solution suggérée est suffisamment intelligente. Si vous l'utilisez correctement (quittez immédiatement si le service est déjà en cours d'exécution, alertez-vous que le service s'est arrêté pour que vous puissiez le réparer, etc.) c'est le moyen le plus simple. Un service qui s'arrête automatiquement est un service problématique, donc vous devriez éventuellement le corriger, mais sinon, en tant que correctif temporaire, un script cron ou un autre démon super simple qui dort la plupart du temps fera très bien l'affaire. Il existe des outils comme mmonit.com/monit mais je pense qu'au final, ils utilisent tous une approche similaire
@MariusMatutiae, je suis d'accord avec votre point mais cela dépend de la nature du service, et la plupart des gestionnaires de processus se retireront après un certain nombre de redémarrages échoués. Il est parfaitement raisonnable qu'un processus se termine naturellement et que nous voulions le redémarrer automatiquement, par exemple un travailleur qui récupère un travail dans une file d'attente et se termine après chaque exécution. C'est également un outil pratique pour les administrateurs système qui souffrent de code de fuite de mémoire sur mesure - limitez la durée de vie d'un processus et redémarrez-le automatiquement avant qu'il ne devienne incontrôlable ...
Alex Forbes

Réponses:

25

Mise à jour mars 2018

Cette réponse est maintenant assez ancienne, et depuis qu'elle a été écrite, systemd a remporté la guerre pid1 sous Linux. Ainsi, vous devriez probablement créer une unité systemd , si systemd est intégré à votre distribution (qui est la plupart d'entre eux).

La réponse ci-dessous est conservée pour la postérité.


La réponse ci-dessus est valide, mais j'ai pensé mentionner quelques alternatives:

Il convient de garder à l'esprit que votre système d'exploitation a déjà résolu le problème de gestion des processus. Traditionnellement, Linux a utilisé sysvinit, qui est essentiellement la collection de scripts que vous voyez dans init.d. Cependant, c'est assez stupide et ne peut pas surveiller les processus, les scripts init.d sont compliqués et il est remplacé pour une bonne raison.

Des systèmes d'exploitation plus modernes commencent à remplacer sysvinit, et les leaders sont Upstart et Systemd. Debian penche vers systemd, Ubuntu a été développé et a déjà pratiquement évolué vers Upstart, et comme Debian Redhat / CentOS / Fedora se dirige vers systemd. Ainsi, si vous utilisez un système d'exploitation qui a déjà remplacé sysvinit, je recommanderais d'utiliser ce qui est intégré. Les scripts sont beaucoup plus faciles à écrire que les scripts d'initialisation.

J'ai utilisé runit et j'aime bien, mais le plus simple à utiliser est superviseur. Il est également très bien documenté, fonctionne presque partout et est inclus dans toutes les principales distributions.

Mais quoi que vous fassiez, s'il vous plaît, s'il vous plaît, veuillez ne pas utiliser de script shell. Il y a tellement de problèmes avec cette approche!

Alex Forbes
la source
comment faire avec sysvinit?
horseyguy
12

iptablesest un mauvais exemple car ce n'est pas vraiment un service ou un démon en cours d'exécution, mais une partie du noyau. Vous ne pouvez pas vraiment "arrêter" iptables, vous pouvez seulement lui donner une configuration et "arrêter" cela implique de lui donner une configuration vierge. En effet, j'ai fait planter des systèmes Linux, mais la configuration de la redirection de port en utilisant iptablescontinue de fonctionner.

Quoi qu'il en soit, un utilitaire appelé monitfera ce que vous voulez. Si vous utilisez Debian, c'est apt-get install monitloin. C'est un peu compliqué à apprendre mais très flexible.

LawrenceC
la source
3

Nous utilisons ce script simple pour lancer une alerte et démarrer le service s'il n'est pas en cours d'exécution, vous pouvez également ajouter d'autres services.

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null
Ranjithkumar T
la source
Le point de MariusMatutiae est correct mais nous avons fait un script simple pour surveiller le service HTTPD et DNS sur mon serveur, il fonctionne bien. Chaque fois que le service est en panne, le script redémarre le service et nous envoie une alerte. Si nous recevons de nombreuses alertes / e-mails concernant le service en panne, nous pouvons alors effectuer une enquête.
Ranjithkumar T
0

Je sais que cela fait plusieurs années que la question n'a pas été posée. mais avec le systemd (principalement disponible avec centos et REHL), vous pouvez exécuter cette commande bash avec cron pour vérifier et redémarrer si le service est en panne.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

enregistrez-le dans votre répertoire bin et nommez-le comme moniteur. Donnez-lui l'autorisation de fichier appropriée. puis lancez-le comme

sudo monitor redis

si vous souhaitez vérifier le service redis et redémarrer / démarrer si nécessaire.

Enfin, ajoutez ceci à votre travail cron.

j'espère que cela vous aidera

Ahmad Sajid
la source
0

Pour ajouter à la longue liste de supervision init / svc, en tant que sous-répertoire de S6, il y a un nouvel enfant sur le bloc, 66, qui gère la gestion des services s6 et la journalisation d'une manière rapide, légère et conviviale. Ceci est le lien vers la documentation officielle d'Obarun-Linux https://web.obarun.org/software

Ceci est une FAQ sur la façon d'utiliser ce logiciel 66 et de donner un sens à s6 http://sysdfree.wordpress.com/266

Depuis sa version stable, un seul bug a été trouvé concernant les changements de noyau de 4.20 -> 5.0, tous les autres problèmes signalés concernaient les personnes apprenant quelque chose de nouveau. Si la gestion des services devait devenir plus simple que cela, il serait préférable de passer à ms-windows (Linus l'interdit). Pour voir dans la vraie vie comment cela peut fonctionner, il suffit de télécharger un Obarun live.iso et de jouer avec. Installez les services et leurs 66 scripts pour les activer, les tuer, voir leurs journaux, les arrêter et les démarrer (lorsqu'ils sont activés), regrouper les services dans une arborescence et avoir des arborescences de service démarrer et arrêter tous ensemble, disposer de services de niveau utilisateur séparément du système. Il fait ce que s6 fait bien et rend plus simple pour l'utilisateur d'exploiter le système pare-balles sous s6.

Les téléchargements d'images peuvent être trouvés ici: https://web.obarun.org/index.php?id=74 fichiers de contrôle md5 https://repo.obarun.org/iso/

Hormis la gestion d'init et de service, s6 / 66 n'a pas de dépendances de quoi que ce soit d'autre sur le système. Il s'agit d'une couche du système de base laissant le reste du logiciel fonctionner seul, init / svc-mgmt en aveugle. Tous les s6 et 66 sont écrits en C et ils ne sont pas spécifiques à Linux ou à la glibc. Les serveurs de Skarnet (auteurs s6) fonctionnent depuis près d'une décennie sans beaucoup de pauses sur le système musl personnalisé. Alpine, Void et Adelie ont actuellement également un logiciel s6 sur leurs référentiels, Adelie l'utilise par défaut pour la supervision des services. Void en contient désormais 66 également. Je ne sais pas si et dans quelle mesure quelqu'un a porté s6 sur xxBSD ou d'autres systèmes xxIX.

Gus Fun
la source