Question

J'ai quelques serveurs et d'autres daemons que je dois commencer dans la bonne séquence.

J'ai créé les scripts d'initialisation à partir du squelette de script, et puis les installer pour commencer dans l'ordre approprié à l'aide du système de nommage numéroté, mais quelques questions demeurent:

Un serveur ( « serverA ») doit initialiser une connexion de base de données, puis écouter sur une prise. Un autre serveur ( « serverB ») a besoin alors de se connecter à cette prise, et la connexion échouera si le processus préalable n'est pas encore à l'écoute. Y at-il un moyen d'empêcher le script init.d pour serverA de mettre fin jusqu'à ce que serverA a commencé à écouter? Le init serverB ne démarre pas jusqu'à ce que le init serverA a pris fin.

En ce moment, la configuration fonctionne en ayant juste serverB nouvelle tentative de connexion jusqu'à ce qu'il réussisse, mais cette approche semble fragile. Je voudrais une compréhension plus déterministe de la façon de forcer le séquençage.

Était-ce utile?

La solution

Oui, ma question est que je réponds, mais je trouve que cette technique soit utile, et je partage pour tous ceux qui luttent d'autre avec les mêmes problèmes.

J'ai trouvé socat très utile dans l'attente d'une prise ou le port. Un script init.d comme:

case “$1″ in
  start)
  echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1
;;

attendra jusqu'à ce que la prise est accessible en écriture, puis revenir. Il n'y a pas démonisation impliqué, donc il bloque l'exécution de scripts init.d numérotés plus jusqu'à ce qu'il se termine.

L'utilisation de ces scripts de serveurs va ralentir la séquence de démarrage, et sont donc non-optimale, mais sont une grande amélioration par rapport à l'approche très fragile de saupoudrage des déclarations n « sommeil » dans les scripts.

Autres conseils

Je ne pense pas que ce soit fragile - au moins je peux penser à ce scénario où il ne sera pas fragile. Avoir un temps de nouvelle tentative de 5 secondes et son pas mal du tout. son approche KISS et il n'y a pas de cas de coin que vous ne comprenez pas.

Obtenir un environnement distribué synchronisé n'est pas pour les faibles de cœur, et son surpuissant dans votre exemple.

Pour vous donner une certaine confiance dans votre approche que je peux vous dire que j'ai des dizaines de processus complexes de serveurs manuscrites répartis sur une batterie de serveurs Web, ils me ont jamais donné de chagrin, même lorsque les serveurs de bases de données ont disparu, ou lorsque le réseau troncs ont baissé, etc. Ils gardent simplement en cours d'exécution en mode dégradé jusqu'à ce que les bases de données reviennent.

Si le serveur écoute sur un socket de domaine, vous pouvez construire une boucle que les sondages pour la prise. Il pourrait y avoir un moyen plus facile de le faire en bash, mais il pourrait ressembler à:

for i in 1 2 3 4 5; do
  if [ -e '/var/run/myserver.sock' ]; then
    break
  fi
done

Une autre solution est d'avoir votre serveur ne daemonize jusqu'à ce qu'il ait ouvert la prise d'écoute. De cette façon, le script d'initialisation se met en pause jusqu'à ce que le processus daemonizes, qui garantit la prise est disponible.

Bien sûr, cela dépend de votre application faisant la démonisation elle-même, plutôt que par d'autres moyens. ( "/ Usr / bin / myserver et" ou similaire).

Mise à jour:

Notez également que, ce que vous faites est maintenant tout init type System-V. Ubuntu utilise en fait Upstart, qui est un système basé sur les événements plutôt que d'une séquence de scripts. Vous pouvez opter pour l'utilisation d'emplois arriviste plutôt que des scripts d'initialisation System-V, et le tir d'un événement Upstart personnalisé à partir de votre serveur, ce qui va déclencher le lancement de votre deuxième serveur.

Le guide Mise en route a un exemple de ce au bas. Je ne sais pas s'il y a un moyen de l'API, mais il pourrait être une question d'un « système ( « / bin / initctl émettre monevenement »); » au bon moment dans le temps dans votre premier serveur. Quelqu'un d'autre avec plus d'expérience Upstart peut être en mesure d'élaborer mieux / plus loin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top