Un moyen simple de redémarrer les processus en panne?

10

J'ai besoin de surveiller plusieurs processus en cours d'exécution sur mon serveur Web. Pour une raison quelconque, le vernis se bloque actuellement une fois par jour ou deux. J'utilise monit pour soi-disant redémarrer le vernis automatiquement, mais cela ne fonctionne pas. Voici mon entrée monit.conf pour Varnish.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

Le fichier journal montre qu'après l'arrêt du vernis, les tentatives de redémarrage échouent ensuite. Finalement, monit cesse de surveiller le vernis.

Quelqu'un a des suggestions pour résoudre ce problème? Ou mieux encore, pouvez-vous suggérer d'autres moyens simples de surveiller et de redémarrer automatiquement les processus en panne? Merci!

Lin
la source
je ne peux pas croire à quel point ces choses étaient difficiles à l'époque pré-systémique.
Fl0v0

Réponses:

17

Je regarderais dans daemontools ( http://cr.yp.to/daemontools.html ).

Supervise a été conçu dans ce but précis - pour démarrer les processus et les surveiller, en les redémarrant immédiatement s'ils se terminent.

Vous pouvez toujours utiliser monit si vous devez faire quelque chose de plus compliqué qu'une simple vérification "est-il toujours en cours", et si le processus doit être redémarré, faites-le via superviser.

Ian Clelland
la source
J'utilise aussi les daemontools pour surveiller les processus de services instables. Assez pratique si je devais dire. :-)
edomaur
4

Vous pouvez également utiliser / etc / inittab pour redémarrer les processus morts en utilisant l' action de réapparition .

Voir la section inittab sur http://aplawrence.com/Unixart/startup.html

Shawn Chin
la source
2

Vous pouvez utiliser des scripts de gestionnaire d'événements avec Nagios si vous en avez pour redémarrer les services.

Si le vernis nécessite l'autorisation root pour démarrer (les scripts init.d le font généralement), changez "/etc/init.d/varnish start" en "sudo /etc/init.d/varnish start". Mais cela ne sera probablement pas suffisant car vous ne voudrez probablement pas donner à tout utilisateur les privilèges de sudo nopasswd à toutes les commandes et donner sudo à un script shell serait fondamentalement tout aussi mauvais. Vous devrez donc déterminer quelles commandes de ce script init ont besoin de sudo, attribuer ces privilèges sudo dans le fichier / etc / sudoers à l'utilisateur monit et enfin modifier ce script init en conséquence. Ou peut-être qu'au lieu de tout cela, le vernis peut être exécuté en tant qu'utilisateur non root?

Enfin, je suis sûr que vous le savez, mais je vais le dire quand même. Vous y mettez clairement beaucoup d'efforts, j'espère que vous faites autant d'efforts pour comprendre pourquoi le vernis se bloque et le réparer (ou pourchasser les développeurs pour comprendre pourquoi) :-)

Mise à jour:
cela peut ne pas être aussi propre, mais un moyen facile de le faire en tant que root peut être de configurer un script qui vérifie si le processus est correct et sinon le démarre. Ensuite, exécutez simplement ce script toutes les deux minutes en tant que tâche cron.

Kyle Brandt
la source
J'ai pensé à Nagios au début, mais je voulais quelque chose de petit et de simple pour mes besoins. Et oui, je regarde la question du vernis. Un de mes serveurs le fait fonctionner de manière stable depuis très longtemps, donc cela a définitivement à voir avec moi. :(
Lin
1

Une autre excellente méthode tirée de StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Cela pourrait être ajouté à la crontab:

crontab -e

Ajoutez ensuite une règle pour démarrer votre script de moniteur:

@reboot /usr/local/bin/myservermonitor

Ou ajouté comme script dans /etc/init.d

Voir la réponse StackOverflow pour une explication détaillée des raisons pour lesquelles il s'agit d'une bonne approche.

Cory Klein
la source
0

Je cherchais également le moyen le plus simple de gérer ce problème. Le moyen le plus simple que j'ai pu trouver est d'ajouter simplement Restart=allwaysau .servicefichier concerné en /etc/systemd/system/multi-user.target.wants/tant que dernière ligne de la [service]balise.

Après cela ne sudo systemctl daemon-reloadsuivie sudo systemctl restart service.servicepour recharger les modifications.

Vous pouvez tester en vérifiant si le service est en cours d'exécution systemctl status processname:, vérifiez l'horodatage de démarrage. Après cela ps -ef | grep servicename, annulez le processus avec l'identifiant que vous venez de trouver kill 1234. après cela, systemctl status processnamerecommencez et vérifiez si l'horodatage de démarrage est mis à jour.

Il devrait fonctionner sur:

  • Debian 7 et Debian 8
  • Ubuntu 15.04 et plus récent
  • CentOS 7 et futur
RoDo
la source