Warum startet mein Upstart-Dienst nicht beim Systemstart?


37

Ausgehend von dieser Frage habe ich einen einfachen Upstart-Dienst ( /etc/init/pms.conf ) für meine Ubuntu Server 11.04-Box ohne Kopf wie folgt geschrieben:

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.

Wenn ich meinen Computer zum ersten Mal starte, wird der Dienst jedoch nicht gestartet. Wenn ich in die Box SSH und überprüfen Sie den Service-Status bekomme ich:

$ service pms status
pms stop/waiting

Meine Frage ist, warum das passiert? Warum startet mein Dienst nicht beim Booten?

UPDATE 1 : Unsicher, ob mein Dienst gestartet wurde und anschließend abstirbt oder überhaupt nicht gestartet wurde, habe ich PMS.sh wie folgt hinzugefügt:

echo "STARTED" > $STARTLOG

Das gibt mir offensichtlich nur etwas zu suchen. Ich habe dies getestet, indem ich den Dienst selbst gestartet und dann start.log überprüft habe . Ich habe dann das start.log gelöscht und neu gestartet. Es war nach dem Neustart nicht da, also scheint es, als würde durch den Neustart definitiv nicht mein Dienst gestartet. Ich nehme an, es könnte zu einem früheren Zeitpunkt in dem Prozess sterben, aber das scheint angesichts der Einfachheit des Ganzen eher unwahrscheinlich.

UPDATE 2 : Ich habe gerade ein Upgrade auf 11.10 durchgeführt, das ein Upstart-Upgrade beinhaltet, aber dieses Problem tritt immer noch auf.

UPDATE 3 : Wie gewünscht habe ich mit gebootet --debug. Die Ausgabe von cat /var/log/syslog | grep initist zu lang, um sie in die Frage zu stellen, aber Sie sehen sie hier .

UPDATE 4 : Weitere Protokolle, diesmal ist die Upstart-Konfig ganz oben enthalten. Führen Sie 1 und 2 aus .


Sind Sie sicher, dass das Skript nicht ausgeführt wurde? Die Meldung "pms stop / waiting" bedeutet, dass der Startjob ausgeführt wurde und alle Befehle normal beendet wurden.
vereinbaren Sie den

Fügen Sie die Ausgabe von hinzu, cat /var/log/syslog | grep initnachdem Sie die Boot-Protokollierung für den Upstart aktiviert haben. Befolgen Sie dazu die Anweisungen unter Upstart Debugging
Ciaran Liedeman,

@ Anarci: Bitte siehe Update 3 in meiner Frage.
Kent Boogaart

Die meisten Benutzer werden diese E-Mail-Adresse nicht weitergeben, sondern einen Link zu einer Pastebin-Site wie Ubuntu Pastebin
Ciaran Liedeman

@Anarci: erledigt - siehe meine Frage.
Kent Boogaart

Antworten:


19

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 unter http://upstart.ubuntu.com/cookbook/

Schauen Sie sich auch http://upstart.ubuntu.com/wiki/Debugging an


Das macht mir wirklich zu schaffen. Ich habe ein Dutzend verschiedener Dinge von Ihrem Posten ausprobiert. Alle sind mit unterschiedlichen undurchsichtigen Meldungen in den Protokollen fehlgeschlagen. Mein letzter Versuch führte dazu, dass der init: pms-Hauptprozess (1329) mit dem Status 143 abgebrochen wurde , was für mich nichts bedeutet. Ich kann sehen, dass PMS.sh nicht einmal gestartet wird, weil es als erstes in sein eigenes Protokoll schreibt und dieser Protokolleintrag nicht vorhanden ist. Ich kann meine Pre-Start-Ausgabe sehen, die besagt, dass die Zieldatei existiert und ausführbar ist. Ich werde das morgen wieder aufgreifen, aber wenn Sie irgendwelche Ideen haben, würde ich sie gerne hören. Vielen Dank.
Kent Boogaart

hi @KentBoogaart, ich scheine dasselbe Problem zu haben. Hast du eine Lösung gefunden?
Daniele B

@KentBoogaart Ich habe das gleiche Problem wie du? Hast du Glück mit dir?
Mevin Babu

14

Was hier wahrscheinlich passiert, ist, dass pms gestartet wird, bevor Ihre Netzwerkadapter hochgefahren werden, und wahrscheinlich sogar vor dem Loopback-Adapter (lo). Angenommen, wir sprechen von PS3 Media Server, es handelt sich um einen Netzwerkdienst, und es mag wahrscheinlich keinen Start ohne verfügbare Schnittstellen.

Versuchen Sie, Ihren Start anhand folgender Kriterien zu ändern:

start on filesystem and net-device-up IFACE!=lo

Das heißt, starten, nachdem eine "echte" Netzwerkschnittstelle aktiv ist. Dies ist jedoch möglicherweise nicht ideal. Wenn eth0 die nächste Schnittstelle ist, wird PMS gestartet, aber Sie möchten wirklich, dass PMS wlan0 verwendet. Dies reicht nicht aus. Der Dienst wird gestartet, konnte jedoch möglicherweise nicht die Schnittstelle auswählen, die abgehört werden soll. Vorausgesetzt, Sie kennen die Schnittstelle, über die Sie streamen werden, und sie wird sich nicht ändern, würde ich sie fest in den Job einprogrammieren, z. B .:

start on filesystem and net-device-up IFACE=wlan0

In Oneiric (11.10) können Sie das Ereignis verwenden static-network-up, um auf alle statisch konfigurierten Geräte zu warten. Das ist schön, weil Sie damit netzwerkabhängige Jobs schreiben können, ohne eine Schnittstelle fest zu codieren. [Hinweis: Bei "allen statisch konfigurierten Geräten" beziehe ich mich auf die Verwendung /etc/network/interfacesanstelle von NetworkManager. Es bedeutet nicht statisch im Sinne von statischer IP vs. DHCP.]


Das klang nach einem Trick, aber es hat nicht funktioniert. Ich habe nur lound eth0doch habe ich Ihren zweiten Vorschlag: start on filesystem and net-device-up IFACE=eth0. Immer noch kein Erfolg nach einem Neustart. Ich habe gerade etwas im PMS-Protokoll bemerkt, das möglicherweise ein Hinweis ist. Ich werde nachforschen und zurückkommen ...
Kent Boogaart

Es ist interessant. Eine Sache, die ich nicht erwähnt habe, ist, dass ich Ihr ursprüngliches Skript ausprobiert habe und es beim Booten meines Computers funktioniert hat. Ich schrieb das nur dem Unentschieden zu (dh in meinem Rennzustand gewann das gute Auto und in Ihrem das schlechte Auto). Ich kann wirklich nicht sehen, welche andere Abhängigkeit wir hier vermissen. Seltsam.
Mark Russell

2
Da Sie es nach dem Booten starten können, müssen wir eine andere Dienstabhängigkeit vermissen. Ein schmutziger Hack, der möglicherweise funktioniert (uns aber überhaupt nicht beleuchtet), besteht darin, einfach ein sleep 10- oder höheres - "Pre-Start-Skript" einzugeben, bevor das Shell-Skript ausgeführt wird.
Mark Russell

Sorry Mark - aber wir sind auf der gleichen Seite. Ich habe das Schlaf-10-Ding bereits in einem Pre-Start-Skript ausprobiert. No Go. Dann habe ich versucht, das debug.log zu löschen und neu zu starten. Nach dem Booten hatte ich den gleichen Dienststatus und keine debug.log-Datei, daher bin ich nicht davon überzeugt, dass PMS überhaupt ausgeführt wird. Gibt es eine einfache Möglichkeit, dies zu diagnostizieren? Wenn ich die Datei PMS.sh so ändere, dass sie etwas ausspuckt, wohin soll es gehen? Ich schätze, ich könnte es immer in meine eigene Datei leiten - könnte das als nächstes versuchen.
Kent Boogaart

Ich habe gerade meine Frage mit mehr Informationen aktualisiert.
Kent Boogaart

3

Von der Prüfung Ihres Syslogs an startet der pms-Prozess fehlerfrei. Nach kurzer Zeit ändert sich sein Ziel von Start zu Stop, was bedeutet, dass es getötet wird.

Dies ist etwas seltsam, da Sie die repsawn-Klausel hinzugefügt haben, sodass sie versuchen sollte, erneut zu starten, nachdem sie angehalten wurde, dies jedoch niemals tut. Ich vermute, Sie haben die Respawn-Klausel entfernt.

Zwischen dem Starten und Stoppen des pms-Dienstes werden nur 2 Dienste ufw und die Netzwerkschnittstelle (eth0) gestartet, und 1 wird udev-fallback-graphics gestartet.

Es scheint, dass Sie pms verarbeiten, wird parallel gestartet. Leider ist die Dokumentation des Emporkömmlings in Bezug auf die genauen Unterschiede zwischen start on ...Vanille und start on starting ...und etwas verschwommen start on started ....

Versuchen Sie, Ihre Startzeilengruppe in zu ändern

start on started networking

oder einfach auch

start on net-device-up IFACE=eth0

Die Protokollausgabe ist etwas seltsam, da das Ereignis net-device-up viel später eintritt, pms jedoch davor startet.

Dies sollte sicherstellen, dass Ihr Prozess erst startet, wenn alle Netzwerkeinstellungen abgeschlossen sind, dh der Job nicht nur gestartet, sondern beendet wurde.

Vertrauen Sie auch der Protokollausgabe nicht vollständig, da die Protokollausgabe zu Beginn des Startvorgangs in einer beliebigen Datei nicht immer funktioniert. Siehe die Antwort in Debugging Upstart


3

Es ist gelungen, ein ähnliches Problem zu beheben, indem stattdessen start on runlevel verwendet wurde:

start on runlevel [2345]

3

Ich hatte das gleiche Problem und löste es schließlich einfach mit:

start on runlevel [2345]

ohne irgendwelche net-device-upoder started networkingsolche Sachen

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

1

Ich bin auf folgendes chkconfigbei meinem RHCSA / CE-Training gestoßen:

sudo apt-get install chkconfig
sudo chkconfig pms on

Auf der Oneiric- Manpage finden Sie weitere Informationen zu den Funktionen.


1

Ich habe eine Lösung dafür gefunden, aber ich verstehe es nicht. Wenn ich PMS von /home/administratorund nach /bin/pmsmit root als Eigentümer verschiebe, funktioniert alles einwandfrei.

Wenn ich es unter lasse, /home/administrator/aber sicherstellen, dass root der Eigentümer von allem ist, abgesehen vom /home/administrator/Verzeichnis selbst, funktioniert es immer noch nicht.

Wenn ich Administrator als Eigentümer von allem festlege und den entsprechenden Teil meines Skripts in Folgendes ändere:

sudo su administrator -c '/home/administrator/pms-current/PMS.sh'

Es funktioniert immer noch nicht.

Ich nehme an, ich mache jetzt ein /home/root/Verzeichnis und verschiebe alles dorthin, obwohl ich das wirklich gerne vollständig verstehen würde.


Also hat das chkconfigauch nicht funktioniert? Haben Sie versucht, das Verzeichnis PMS.shanzugeben, in dem sich root befindet? Wenn nur Ihre Lösung funktioniert, rufen Sie die Launchpad-Seite von Upstart auf und wenden Sie sich direkt an die Entwickler.
Oxwivi

Und wenn es ausreicht, nur das zu verschieben, lassen Sie .sheinfach alles dort und bearbeiten Sie das Skript, um auf dieses Verzeichnis zu verweisen (oder vielleicht sogar das Verzeichnis zu ändern?).
Oxwivi

Ja, ich habe versucht, das gesamte PMS-Verzeichnis in den Besitz von root zu bringen. Vermutlich hat es nicht funktioniert, weil / home / administrator / nicht im Besitz von root ist.
Kent Boogaart

Das macht sowieso keinen Sinn, ich führe regelmäßig Skripte in meinem / home-Verzeichnis über upstart ohne Probleme aus, komisch.
vereinbaren Sie den

Noch seltsamer: Ich habe gerade alles unter / home / root / ausprobiert, was offensichtlich root gehört. Hat nicht funktioniert Ich habe alles wieder unter / bin / pms verschoben und es hat wieder funktioniert. Es scheint also, als würde der Versuch, PMS von unter / zu Hause aus zu starten, auf meinem System nicht funktionieren.
Kent Boogaart

1

Ich hatte ein ähnliches "no start" -Problem, als ich feststellte, dass mein Skript von einer Datei abhing, die sich in meinem Heim befand, und auf die nicht zugegriffen werden konnte, weil sie mit dem Standard-Ubuntu-Mechanismus (.Private) verschlüsselt war.

start on local-filesystems Das Ereignis wird (wahrscheinlich) ausgegeben, bevor der Entschlüsselungsprozess beendet ist.


1

Ist Ihr Home-Verzeichnis auf NFS? Manchmal kann root nicht auf NFS zugreifen.

Fürs Protokoll, in meinem kleinen Test gerade am 12.04:

  • start on started networkingund start on network-interface-up INTERFACE=eth0 nicht arbeiten, aber

  • start on started network-interface INTERFACE=eth0 tut.

Dank http://os4.org/wiki/upstart.html für den Hinweis auf , dass initctl list immer Arbeit zeigt , wie gestoppt Vernetzung.


Der Link, auf den verwiesen wird, ist fehlerhaft.
SLM


0

Ähnlich wie bei @xuhcc bin ich hierher gekommen, um herauszufinden, warum mein Vagrant Upstart-Skript nicht ausgeführt wurde. Folgendes soll funktionieren:

Start auf Vagabunden

In einigen Builds aufgrund des folgenden Fehlers jedoch nicht.

https://github.com/mitchellh/vagrant/issues/6074

Die im Bericht aufgeführte Problemumgehung hat für mich hervorragend funktioniert:

$ cat /etc/init/workaround-vagrant-bug-6074.conf 
# workaround for https://github.com/mitchellh/vagrant/issues/6074
start on filesystem
task

env MOUNTPOINT=/vagrant

script
  until mountpoint -q $MOUNTPOINT; do sleep 1; done
  /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT
end script

Hat super für mich funktioniert


0

es hat bei mir funktioniert (ich muss nach iface up den Service starten):

start on started networking and net-device-up IFACE=wlan1 
stop on shutdown

respawn
respawn limit 10 10
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.