Upstart: Was ist die erste erfasste PID, die nicht erwartet wird, jedoch mit Skript und Exec?

936
Thorsten Schöning

Ich habe einige Upstart-Konfigurationen verwendet, um einige Vordergrund- und Blockierungsprozesse zu starten, die im Hintergrund als eine Art "Daemons" ausgeführt werden, insbesondere diese Prozesse verzahnen sich auf keinen Fall. Was ich möchte, ist, sie automatisch neu zu starten, wenn sie aus einem unbekannten Grund beendet werden, also habe ich sie konfiguriert respawn, aber da sich diese Prozesse nicht verzahnen, habe ich NICHT konfiguriert expect. Das schien wie erwartet zu funktionieren, aber in letzter Zeit habe ich etwas geändert und heute habe ich wieder etwas im Upstart-Kochbuch gefunden, was mich wunderte ...

Wenn Sie die Expect-Zeilengruppe nicht angeben, verfolgt Upstart den Lebenszyklus der ersten PID, die in den Exec- oder Script-Zeilengruppen ausgeführt wird.

Ich benutze eine scriptZeilengruppe, um den Klassenpfad für meinen "Daemon" zu erstellen. Vor kurzem habe ich einige hinzugefügt, die darauf warten, dass Postgres und / oder einige Webanwendungen fertig werden, und meinen Prozess anschließend execin dieser scriptZeilengruppe ausführen . Zum Warten verwende ich Werkzeuge wie psund curl, weil ich das "erste PID-Ding" vergessen habe und Upstarts execmit dem der Shell, die das ausführt, verwechselt zu haben scheint script.

Ein Beispiel config:

script waitForPostgres() { while [ true ] do # http://superuser.com/questions/597549/grep-fails-in-upstart-script if ps ax | grep "[p]ostgres: wal writer process" > /dev/null then break fi  sleep 10s done }  waitForPostgres  cd "$basePath"  CLASSPATH=$basePath/lib for i in `ls $basePath/lib/*.jar` do CLASSPATH=$CLASSPATH:$i done export CLASSPATH  exec java [...] end script 

Das waitForPostgresZeug ist neu und aus meinem Verständnis sind alles andere Shell-Einbauten und ohne waitForPostgresden zuerst ausgeführten und daher nachverfolgten Prozess java. Aber mit meiner Zusatzfunktion vermute ich, dass Upstart psstattdessen Tracks verfolgt und offensichtlich nicht das ist, was ich will.

Also, die PID wird in diesem Beispiel verfolgt, dass die ps, grepoder, javaund warum?

Und wenn nicht javanachverfolgt wird, irgendwelche Ideen für Problemumgehungen, um die letzte PID anstelle der ersten zu verfolgen?

Vielen Dank!

1

1 Antwort auf die Frage

0
Thorsten Schöning

Ich habe die Antwort mit etwas anderen Suchbegriffen gefunden:expect stop

Leider bedeutet dies, dass Upstart den ersten Aufruf von sed als erste PID erkennt

Außerdem ist die Antwort auf einen Workaround in der Nähe pre-start, der genau für diesen Zweck entwickelt wurde. Ich habe nicht darüber nachgedacht, obwohl ich es schon in den Dokumenten gelesen habe ...

Ich habe auch einen interessanten Vorschlag gefunden: Möglichkeit, explizit zu sagen, welche PID zu verfolgen ist

Aufgrund einiger Probleme bei einem meiner Dienste habe ich noch einmal nachgeschaut, wie es sich mit Upstart verhält, und Folgendes gefunden: Meine Zeilengruppe "script" ruft immer noch Binärdateien wie "dirname", "readlink" und "ls" auf harter Code ein funktionierendes Verzeichnis, Java-Klassenpfad erstellen und so weiter. Der wichtige Teil ist, dass diese keine eingebauten Shell sind und daher von Upstart nachverfolgt werden sollten, da "readlink" die erste in "start" ausgeführte Binärdatei ist. Dies ist jedoch nicht der Fall, diese PIDs scheinen ignoriert zu werden und Upstart verfolgt stattdessen die PID des Befehls "exec java ...", den ich wirklich verfolgt sehen möchte. Ich habe das überprüft, indem ich "service ... status" aufrief und die Ausgabe mit "ps axf | grep ..." vergleiche und beide PIDs übereinstimmen.

Zwei mögliche Erklärungen: Da "dirname" und Co. als Befehlssubstitution verwendet werden, erkennt Upstart die erstellten Subshells anhand der von ihr selbst erstellten Shell für die Zeilengruppe "script" und ignoriert diese PIDs zweckmäßig. Andernfalls kann "exec" eine PID zurückgeben, die eine zuvor erkannte PID überschreibt. Ich bezweifle das Letztere und denke, dass Subshells einfach ignoriert werden, was dann ein sehr schönes Feature ist.