Im Anschluss andiese Frage, ich habe einen einfachen Upstart-Dienst geschrieben (/etc/init/pms.conf) für meine Headless-Ubuntu-Server-11.04-Box wie folgt:
start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn
exec /home/administrator/pms-current/PMS.sh
Ich kann diesen Dienst nach Belieben über die Befehlszeile starten (oder stoppen):
service pms start
Und ich kann sehen, dass es tatsächlich läuft.
Beim ersten Booten meines Rechners startet der Dienst jedoch nicht. Wenn ich mich per SSH mit der Box in Verbindung setze und den Dienststatus überprüfe, erhalte ich:
$ service pms status
pms stop/waiting
Meine Frage ist, warum das passiert. Warum startet mein Dienst beim Booten nicht?
AKTUALISIERUNG 1: Da ich nicht sicher war, ob mein Dienst gestartet und anschließend beendet wurde oder ob er einfach überhaupt nicht gestartet wurde, habe ich Folgendes zu PMS.sh hinzugefügt:
echo "STARTED" > $STARTLOG
Das gibt mir offensichtlich nuretwaszu suchen. Ich habe dies getestet, indem ich den Dienst selbst gestartet und dann überprüft habestart.log. Ich habe dann diestart.logund neu gestartet. Nach dem Neustart war es nicht da, also scheint es, als würde Upstart meinen Dienst definitiv nicht starten. Ich nehme an, es könnte zu einem früheren Zeitpunkt des Prozesses abgestürzt sein, aber das scheint angesichts der Einfachheit des Ganzen eher unwahrscheinlich.
AKTUALISIERUNG 2: Ich habe gerade auf 11.10 aktualisiert, was ein Upstart-Upgrade beinhaltet, aber dieses Problem tritt immer noch auf.
AKTUALISIERUNG 3: Wie gewünscht habe ich mit gebootet --debug
. Die Ausgabe von cat /var/log/syslog | grep init
ist zu lang, um sie in die Frage einzufügen, aber Sie können sie sehenHier.
AKTUALISIERUNG 4: Weitere Protokolle, dieses Mal ist die Upstart-Konfiguration oben enthalten.Lauf 1UndLauf 2.
Antwort1
Ich würde empfehlen, die Ausführlichkeit des Jobs zu erhöhen, z. B. durch die Verwendung von Einträgen vor dem Start/nach dem Start.
pre-start script
logger "pre-start for myprog"
end script
post-start script
logger "post-start for myprog"
end script
# and for PMS itself:
script
logger "just before executing PMS"
exec /home/administrator/pms-current/PMS.sh
end script
Weitere Informationen unterhttp://upstart.ubuntu.com/cookbook/
Schauen Sie sich auch anhttp://upstart.ubuntu.com/wiki/Debugging
Antwort2
Was hier wahrscheinlich passiert, ist, dass pms startet, bevor Ihre Netzwerkadapter hochfahren, und wahrscheinlich sogar vor dem Loopback-Adapter (lo). Angenommen, wir sprechen vom PS3 Media Server, es handelt sich um einen Netzwerkdienst und er startet wahrscheinlich nicht gerne, wenn keine Schnittstellen verfügbar sind.
Versuchen Sie, Ihre Startkriterien wie folgt zu ändern:
start on filesystem and net-device-up IFACE!=lo
Das heißt, starten Sie, nachdem eine „echte“ Netzwerkschnittstelle aktiv ist. Das ist jedoch möglicherweise nicht ideal. Wenn eth0 die nächste aktive Schnittstelle ist, startet PMS, Sie aber wirklich möchten, dass PMS wlan0 verwendet, ist das nicht möglich. Der Dienst wird zwar gestartet, konnte aber möglicherweise nicht die Schnittstelle auswählen, auf der er lauschen soll. Vorausgesetzt, Sie kennen die Schnittstelle, über die Sie streamen möchten, und sie wird sich nicht ändern, würde ich sie fest in den Job codieren, z. B.:
start on filesystem and net-device-up IFACE=wlan0
Unter Oneiric (11.10) können Sie das Ereignis verwenden, static-network-up
um auf alle statisch konfigurierten Geräte zu warten. Das ist praktisch, weil Sie so netzwerkabhängige Jobs schreiben können, ohne eine Schnittstelle fest zu codieren. [Hinweis: Mit „alle statisch konfigurierten Geräte“ meine ich die Verwendung /etc/network/interfaces
anstelle von NetworkManager. Es bedeutet nicht statisch im Sinne von statischer IP vs. DHCP.]
Antwort3
Aus der Untersuchung Ihres Syslogs geht hervor, dass der PMS-Prozess ohne Fehler startet, dann aber nach kurzer Zeit sein Ziel von „Start“ auf „Stopp“ ändert, was bedeutet, dass er beendet wird.
Das ist etwas seltsam, weil Sie die Repsawn-Klausel hinzugefügt haben, sodass es nach dem Stoppen versuchen sollte, erneut zu starten, was aber nie passiert. Ich vermute also, dass Sie die Respawn-Klausel entfernt haben.
Zwischen dem Starten und Stoppen des PMS-Dienstes werden nur zwei Dienste gestartet: UFW und Netzwerkschnittstelle (eth0) und einer: udev-fallback-graphics.
start on ...
Es scheint, dass Ihr PMS-Prozess parallel gestartet wird. Leider ist die Upstart-Dokumentation hinsichtlich der genauen Unterschiede zwischen Vanilla und start on starting ...
und etwas unklar start on started ...
.
Versuchen Sie, Ihre Startstrophe zu ändern in
start on started networking
oder einfach zu
start on net-device-up IFACE=eth0
Die Protokollausgabe ist etwas seltsam, da das Net-Device-Up-Ereignis viel später auftritt, PMS jedoch davor startet.
Dadurch wird sichergestellt, dass Ihr Prozess nur einmal gestartet wirdalleDie Netzwerkeinrichtung ist abgeschlossen, d. h. der Auftrag wurde nicht nur begonnen, sondern auch beendet.
Vertrauen Sie auch nicht vollständig auf die Protokollausgabe, da die Protokollierung der Ausgabe in eine beliebige Datei zu Beginn des Bootvorgangs nicht immer funktioniert. Die Antwort finden Sie inDebuggen von Upstart
Antwort4
Ich hatte das gleiche Problem und habe es schließlich gelösteinfachmit:
start on runlevel [2345]
ohne irgendwas net-device-up
oder started networking
so
Dies ist das vollständige Upstart-Skript und es funktioniert perfekt:
# MyApp
description "MyApp"
author "me"
start on runlevel [2345]
stop on runlevel [016]
respawn
exec /usr/bin/myapp 2>> /var/logs/myapp.log