Frage

Ich habe ein paar Server und andere Dämonen Ich muss in der richtigen Reihenfolge starten.

Ich habe init.d-Skripte aus dem Skelett Skript erstellt und kann sie installiere in der richtigen Reihenfolge mit dem nummerierten Benennungssystem, aber ein paar Probleme bleiben starten:

Ein Server ( ‚serverA‘) muss eine Datenbankverbindung initialisieren, und dann auf einem Sockel zu hören. Ein weiterer Server ( ‚serverB‘) muss dann an diese Buchse verbinden, und die Verbindung schlägt fehl, wenn der vorherige Prozess hört noch nicht ist. Gibt es eine Möglichkeit, die init.d-Skript für serverA zu verhindern, dass endet, bis serverA hören begonnen hat? Die serverB init startet erst die serverA init beendet hat.

Im Moment arbeitet das Setup, indem serverB nur die Verbindung erneut versuchen, bis es gelingt, aber dieser Ansatz scheint zerbrechlich. Ich mag ein deterministisches Verständnis davon, wie die Sequenzierung zu erzwingen.

War es hilfreich?

Lösung

Ja, das ist meine Frage, die ich beantworten, aber ich fand diese Technik nützlich zu sein, und für niemanden teilen ist sonst mit ähnlichen Problemen zu kämpfen.

Ich habe socat gefunden als sehr nützlich für eine Buchse oder Port in warten. Ein init.d Skript wie:

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

wird warten, bis die Buchse beschreibbar wird, dann zurück. Es gibt keine daemonization beteiligt, so blockiert es die Ausführung der höheren nummerierte init.d-Skripte, bis es fertig ist.

Die Verwendung solcher Kellner Skripte wird die Boot-Sequenz verlangsamen, und ist somit nicht optimal, aber ist eine große Verbesserung gegenüber dem sehr fragilen Ansatz der Besprengung Schlaf n 'Aussagen in den Skripten.

Andere Tipps

Ich glaube nicht, es zerbrechlich ist - zumindest kann ich von Szenarien denkt, wo es nicht zerbrechlich sein. Haben Sie eine Wiederholungszeit von 5 Sekunden und die gar nicht so schlecht. es ist ein KISS Ansatz und es gibt keine Ecke Fälle, die Sie nicht verstehen.

Wie Sie einen verteilten Umgebung synchronisiert ist nicht für schwache Nerven, und seine viel des Guten in Ihrem Beispiel.

Ihnen in Ihrem Ansatz etwas Vertrauen geben, kann ich Ihnen sagen, dass ich Dutzende von handgeschriebenen komplexen Server-Prozessen über eine Web-Farm verteilt habe, haben sie mir nie Kummer auch gegeben, wenn Datenbankservern verschwunden ist, oder wenn das Netzwerk Stämme haben gegangen usw. einfach in eingeschränktem Betrieb laufen Sie halten bis die Datenbanken zurückkommen.

Wenn der Server auf einem Domain-Socket lauscht, könnte man eine Schleife, die Umfragen für den Sockel bauen. Es könnte ein einfacher Weg, dies in bash zu tun, aber es könnte in etwa so aussehen:

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

Eine weitere Lösung ist der Server nicht haben daemonize, bis er die Abhörsocket geöffnet hat. Auf diese Weise, das Init-Skript, bis der Prozess daemonizes halten wird, die garantiert die Steckdose verfügbar ist.

Natürlich hängt dies von der Anwendung macht die daemonization selbst, anstatt durch andere Mittel. ( "/ Usr / bin / myserver &" oder dergleichen.)

Aktualisiert:

Beachten Sie auch, dass, was Sie tun jetzt alle System-V-Stil init ist. Ubuntu tatsächlich nutzt Upstart, das ist ein ereignisbasiertes System eher als eine Folge von Skripten. Sie könnten für die Verwendung von Emporkömmling Jobs entscheiden, anstatt System-V-Init-Skripte und ein benutzerdefiniertes Upstart-Event von Ihrem Server Brennen, die den Start des zweiten Servers auslösen.

Die Führung ein Beispiel hat Getting Started dies ganz am Ende. Ich weiß nicht, ob es eine API Art und Weise, aber es kann nur eine Frage eines „System sein (‚/ ist / initctl emittieren myevent‘),“ im richtigen Zeitpunkt in Ihrem ersten Server. Jemand anderes mit mehr Upstart Erfahrung kann in der Lage sein, besser zu erarbeiten / weiter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top