Comment contrôler le taux de redémarrages automatiques d'un service runit?

J'ai ce service runit avec log/run scripts run et log/run correctement.

En cas de problème, le service lui-même peut se bloquer pour des raisons externes et peut ne pas pouvoir démarrer pendant de nombreuses minutes. La manière par défaut qui exécute cette situation est de redémarrer le service toutes les deux secondes. Comment puis-je modifier ce comportement?

Mon dernier aperçu était d'append un script de check et de faire de la magie là-bas, mais cela semble beaucoup plus compliqué qu'il ne le devrait. Existe-t-il un moyen plus simple?

Je ne suis pas familier avec cette installation, cependant, s'il s'agissait de ma tâche de résoudre ce problème, et une très courte lecture de la page de manuel n'offrait pas de button simple pour régler ce comportement, je ferais ce qui suit:

Soit étendez le script de démarrage du service existant, soit si cela est lourd, insérez un nouveau script de début dans la string (qui à son tour commence le script de début d'origine). Au lieu de démarrer le service tout de suite, le nouveau script de démarrage devrait vérifier si le dernier démarrage s'est produit assez récemment. Cela peut se faire en vérifiant un file de signalisation créé par le démarrage précédent. Si le file n'existe pas, le script peut continuer et toucher le file et démarrer le service. Si le file existe, le script doit vérifier si le file est assez ancien. Si ce n'est pas assez vieux, il devrait attendre (dormir) en boucle jusqu'à ce que le file soit suffisamment vieux.

Quelque chose comme cela pourrait fonctionner (attend au less 1 minute entre les redémarrages):

 #!/bin/bash SIGNALDIR=/tmp SIGNALFILE=service.started while /bin/true; do found=`find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l` [ "${found}" -eq 0 ] && break echo "Waiting" sleep 10 done touch "${SIGNALDIR}/${SIGNALFILE}" original service start... 

Vous devriez limiter les taux de redémarrage dans le file ./finish pour ce service, qui s'exécute lors d'une interruption anormale. Le script ./finish recevra le code de return de ./run et de là, vous pouvez déterminer ce qu'il faut faire, etc. Pour cette raison, vous devriez avoir votre script ./finish crier fort sur les pannes et envoyer des notifications et sauter tout autour sur le feu…

Je ne suis vraiment pas un fan de la gestion des process basée sur init (et runit est fondamentalement un remplaçant init). Au fur et à mesure que vous découvrirez, le redémarrage simple des process défaillants dès leur décès n'est pas une stratégie particulièrement bonne. J'ai utilisé init pour redémarrer monit, mais c'est aussi loin que possible. (potentiellement, le tueur OOM pourrait tuer monit).

Donc, je vous encourage à chercher un rlocation plutôt qu'à réparer les choses.

Monit est assez vieux, mais ça fonctionne bien, et je ne suis au courant de rien de mieux. Il a la belle fonctionnalité de ne pas avoir besoin de malloc plus de memory après le démarrage, donc sort de tout ce qui est écrit dans un langage de script. La dernière chose que vous voulez, c'est que votre moniteur de process est en train de mourir parce qu'il ne peut pas se souvenir.