Wie kann man eine Endlosschleife in Upstart "Pre-Start Script" erzwingen?

314
Thorsten Schöning

Ich habe Folgendes pre-start scriptin einer meiner Upstart-Konfigurationen:

pre-start script cd "$(dirname "$(dirname "$(readlink "/etc/init/$.conf")")")"  . "lib/upstart/waitFor[...].sh" end script 

Die aufgerufene Funktion ist im Wesentlichen nur eine Endlosschleife, die darauf wartet, dass eine Ressource verfügbar wird, für die derzeit keine Upstart-Konfiguration vorhanden ist:

function waitFor[...]() { while [ true ] do if [...] > /dev/null then break fi  sleep 10s done }  waitFor[...] 

Gestern habe ich ein Problem mit diesem Ansatz erkannt, wenn die erwartete Ressource aus irgendeinem Grund nicht verfügbar wird: Der Job hängt für immer fest start/pre-start, was erwartet wird, aber wenn ich ein stopEreignis ausstelle, wird das pre-start scriptnicht getötet oder ähnliches, was ich falsch angenommen habe. Stattdessen wird der Status des Jobs in geändert stop/pre-start. Das Problem dabei ist, dass die Shell, in der ich das stopEreignis ausgegeben habe, jetzt für immer hängt und höchstwahrscheinlich auf das pre-start scriptEnde wartet . Wenn ich diese Shell STRG + C stelle und stoperneut ausgeben, meldet Upstart, dass der Job bereits gestoppt ist und schnell zurückkehrt, der aber pre-start scriptnoch läuft, was leicht zu sehen statusist stop/pre-start.

Ich brauche also einen Weg, Upstart entweder dazu zu zwingen, das Skript selbst zu beenden oder im Skript zu erkennen, dass es aufhören sollte, selbst zu warten.

Ich finde kein forceArgument oder ähnliches nur für Upstart --no-wait. Damit wird das wartende Skript jedoch nicht gestoppt, nur die blockierende Shell wird nicht mehr blockiert. Gibt es also eine Zustandsänderung, die das Skript leicht erkennen kann? Das einzige, was mir momentan einfällt, ist die Abfrage des Auftragsstatus.

Noch mehr Ideen? Ich denke, ich würde ein Kommandozeilenargument für den Stopp vorziehen, den ich vielleicht übersehen hätte.

0

0 Antworten auf die Frage