Da Ubuntu seit einiger Zeit auf Upstart angewiesen ist, möchte ich einen Upstart-Job verwenden, um bestimmte Anwendungen beim Herunterfahren oder Neustarten des Systems ordnungsgemäß herunterzufahren. Es ist wichtig, dass das Herunterfahren oder Neustarten des Systems blockiert wird, bis diese Anwendungen heruntergefahren werden.
Die Anwendungen werden gelegentlich manuell gestartet, und beim Herunterfahren des Systems sollte automatisch ein Skript beendet werden (das ich bereits habe). Da die Anwendungen nicht zuverlässig beendet werden können, ohne dass (fast alle) anderen Dienste ausgeführt werden, muss das Beenden der Anwendungen erfolgen, bevor der Rest des Herunterfahrens beginnt.
Ich denke, ich kann dies durch einen Startjob lösen, der beim Herunterfahren ausgelöst wird, aber ich bin mir nicht sicher, welche Ereignisse ich auf welche Weise verwenden soll. Bisher habe ich folgende (teilweise widersprüchliche) Aussagen gelesen:
- Es gibt kein allgemeines Herunterfahren im Upstart
- Verwenden Sie eine Zeilengruppe wie
start on starting shutdown
in der Jobdefinition - Verwenden Sie eine Zeilengruppe wie
start on runlevel [06S]
in der Jobdefinition - Verwenden Sie eine Zeilengruppe wie
start on starting runlevel [06S]
in der Jobdefinition - Verwenden Sie eine Zeilengruppe wie
start on stopping runlevel [!06S]
in der Jobdefinition
Aus diesen Empfehlungen ergeben sich folgende Fragen:
- Gibt es ein allgemeines Shutdown-Ereignis in Ubuntus Upstart oder nicht?
- Was ist der empfohlene Weg, um einen "Shutdown Hook" zu implementieren?
- Wann werden die Ereignisse Runlevel [x] ausgelöst? Ist dies beim Betreten des Runlevels oder beim Betreten des Runlevels?
- Können wir so etwas wie
start on starting runlevel [x]
oder verwendenstart on stopping runlevel [x]
? - Was wäre die beste Lösung für mein Problem?
Vielen Dank
startup
Ereignis ist, dass etwas zum "Ansaugen der Pumpe" erforderlich ist. Nachdem dieses eine privilegierte Ereignis gesendet wurde, kann und wird alles andere durch die Jobs und Aufgaben definiert, die von ausgelöst werdenstartup
. Da es kein einzigesshutdown
Ereignis gibt, gibt es zu viele verschiedene Arten,shutdown
als dass dies sinnvoll wäre. Es ist besser, sich direkt auf die Jobs zu verlassen, die ausgeführt werden müssen.on stopping servicea or stoping serviceb or ...
für alle Dienste, die Sie ausführen müssen, weiterzumachen.Um zu verhindern, dass das Herunterfahren fortgesetzt wird, während Ihr Job beendet wird, sollten Sie Folgendes verwenden:
Dies funktioniert, da als erstes, wenn Sie 'shutdown' eingeben, Tunlevel 0 ausgegeben wird. rc startet auf Runlevel und der Übergang von gestoppt -> Start wird vollständig blockiert, bis alle Jobs, die ebenfalls den Status ändern müssen, diesen Status abschließen.
Sie sollten sicherstellen, dass Ihr Prozess schnell auf SIGTERM reagiert. Wenn es nicht innerhalb von 5 Sekunden antwortet, sendet Upstart es SIGKILL. Sie können dies mit 'Kill Timeout X' erhöhen.
Die 1 dort ist übrigens etwas knifflig. Sie müssen sicherstellen, dass Ihr Start etwas enthält, das zu diesem Zeitpunkt auf Runlevel [2345] beginnt, damit ein Benutzer, der für die Wartung im Einzelbenutzermodus ausfällt, seinen Job erneut startet. Glücklicherweise wurde viel Arbeit investiert, um dies zum vorgeschlagenen üblichen Start zu machen
In einigen Fällen benötigen Sie auch etwas, das so lange läuft, bis das Netzwerk heruntergefahren ist (z. B. dbus / network-manager). Dafür willst du
Dies ist ein Ereignis, das später beim Herunterfahren ausgegeben wird und das ebenfalls blockiert wird, bis alle Jobs, die es verwenden, ihre Statusübergänge vollständig abgeschlossen haben.
quelle
start on starting ...
es macht nicht viel Sinn, wenn mein Abschalthaken an irgendetwas anhält.start on starting rc RUNLEVEL=[016]
würde viel mehr Sinn machen. Und vielleicht wird eintask
hineingeworfen, um sicherzustellen, dass es abgeschlossen werden kann, bevor andere Dinge laufen.Geekosaurier, vielen Dank für Ihre Hilfe.
In der Zwischenzeit habe ich die
start on runlevel [016]
Methode ausprobiert , aber sie hat nicht funktioniert, und ich glaube, ich verstehe warum:Der Job wurde zwar gestartet, aber das Herunterfahren wurde erst blockiert, nachdem die Aufgabe des Jobs abgeschlossen wurde. Ich bin mir jetzt ziemlich sicher, dass die Ereignisse
starting
undstopping
die einzigen Ereignisse sind, die in einer Jobdefinition verwendet werden können, um andere Jobs zu blockieren, und ich denke, dass dies in den Handbüchern von Upstart versucht wird, uns zu sagen. Daher führt die Verwendung des Runlevel-Ereignisses niemals zum Blockieren anderer Jobs oder zum Herunterfahren. daher ist es für meinen Zweck nutzlos.Stattdessen habe ich zwei Möglichkeiten:
Finden Sie nach einem Ihrer Vorschläge alle Jobs heraus, die die jeweiligen Anwendungen benötigen, und fügen Sie alle in das Startereignis für das folgende Skript ein:
Dies ist so viel Arbeit, dass ich ernsthaft darüber nachdenke, die Jobliste zu sichern und durch sed zu führen, um automatisch eine Startzeilengruppe für meinen Job zu erstellen, die alle Jobs enthält, die normalerweise auf dem System ausgeführt werden.
Der Vorteil wäre, dass die jeweiligen Anwendungen selbst dann heruntergefahren würden, wenn jemand eine der Voraussetzungen manuell stoppt (im Gegensatz zum Stoppen durch Runlevel-Änderung / Herunterfahren / Neustart).
Suchen Sie den einen Job, der beim Neustart / Herunterfahren des Systems zuerst gestoppt wird (nennen wir diesen Job "FirstJob"), und verwenden Sie diesen Job in einer Zeilengruppe wie:
Die Hauptnachteile wären, dass ich nicht weiß, ob ein solcher Job überhaupt existiert und ob dieser Job wirklich von allen anderen Jobs abhängt, von denen die jeweilige Anwendung tatsächlich abhängt ("hängt von einem anderen Job ab" bedeutet in diesem Fall "wird gestoppt" vollständig bevor andere Jobs zu stoppen beginnen ").
Ich bin mir nicht sicher, welche der beiden Möglichkeiten die bessere ist ...
quelle
sed
Drehbuch gleich machen, wenn ich in deinen Schuhen stecke.