it-swarm.com.de

Beste Weg, um einen Abschalthaken zu machen?

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 das Herunterfahren des Systems sollte automatisch durch ein Skript (das ich bereits habe) beendet werden. 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 Abschaltereignis beim Start
  • 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 Abschaltereignis in Ubuntus Startup?
  • Was ist der empfohlene Weg, um einen "Shutdown Hook" zu implementieren?
  • Wann werden die Ereignisse Runlevel [x] ausgelöst; Ist dies, wenn Sie das Runlevel betreten haben oder wenn Sie das Runlevel betreten haben?
  • Können wir etwas wie start on starting runlevel [x] oder start on stopping runlevel [x] verwenden?
  • Was wäre die beste Lösung für mein Problem?

Vielen Dank

9
Binarus

starting und runlevel sind separate Ereignisse, daher können Sie starting runlevel N nicht sinnvoll sagen.

Das Ereignis runlevel N wird zu Beginn der Eingabe des Runlevels ausgegeben. Wenn Sie start on runlevel N, wird Ihre Aufgabe bei der Eingabe ausgeführt. Die Art, wie ausgeführt wird, wenn die Eingabe des Runlevels abgeschlossen ist, ist run on started rc RUNLEVEL=N.

Soweit ich weiß, brauchen Sie einen start on runlevel [06S], um das zu tun, was Sie wollen. Es sollte theoretisch laufen, bevor irgendetwas anderes gestoppt wird. Zur genaueren Steuerung können Sie start on stopping Apache or stopping mysql or ... verwenden, damit Ihre Aufgabe ausgeführt wird, bevor sie beendet werden darf.


Bearbeitet, um Runlevel 5 in S zu ändern.

2
geekosaur

Um zu verhindern, dass das Herunterfahren bei angehaltenem Job fortgesetzt wird, möchten Sie Folgendes ausführen:

stop on starting rc RUNLEVEL=[016]

Dies funktioniert, weil das erste, was passiert, wenn Sie 'shutdown' eingeben, der Sendepegel 0 ist. rc startet auf Runlevel, und der Übergang von Angehalten -> Starten 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. Das kannst du mit 'kill timeout X' erhöhen.

Die 1 ist übrigens etwas knifflig. Sie müssen sicherstellen, dass Ihr Start bei etwas beginnt, das zu diesem Zeitpunkt auf Runlevel [2345] beginnt, damit ein Benutzer, der die Einzelbenutzermoduswartung in Anspruch nimmt, seinen Job erneut startet. Zum Glück wurde viel Arbeit investiert, um dies zum vorgeschlagenen gewöhnlichen Start zu machen

start on runlevel [2345]

In einigen Fällen müssen Sie auch etwas ausführen, bis das Netzwerk heruntergefahren ist (z. B. dbus/network-manager). Dafür willst du

stop on deconfiguring-networking

Dies ist ein Ereignis, das später beim Herunterfahren ausgelöst wird und das auch blockiert wird, bis alle Jobs, die es verwenden, ihre Übergänge im Status vollständig abgeschlossen haben.

2
SpamapS

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 der Vorgang zum Herunterfahren wurde nicht blockiert, bis der Job beendet wurde. Ich bin mir ziemlich sicher, dass die Ereignisse starting und stopping die einzigen Ereignisse sind, die in einer Jobdefinition verwendet werden können, um andere Jobs zu blockieren, und ich denke, dass Upstarts Handbücher dies zu erklären versuchen. 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 scheine ich zwei Möglichkeiten zu haben:

  1. Befolgen Sie einen Ihrer Vorschläge, und finden Sie alle Jobs heraus, die die entsprechenden Anwendungen benötigen. Nehmen Sie alle in das Startereignis für das Skript wie das folgende auf:

    start on stopping job1 or stopping job2 or ...
    

    Dies ist so viel Arbeit, dass ich ernsthaft darüber nachdenke, die Jobliste zu sichern und sie zu durchlaufen, 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 auch dann heruntergefahren würden, wenn jemand eine der Voraussetzungen manuell stoppt (im Gegensatz zu einem Runlevel-Wechsel/Herunterfahren/Neustart).

  2. Suchen Sie den einen Job, der beim Neustart/Herunterfahren des Systems zuerst angehalten wird (nennen wir diesen Job "FirstJob"), und verwenden Sie diesen Job in einer Zeilengruppe wie:

    start on stopping FirstJob
    

    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 Bewerbung tatsächlich abhängt ("hängt von anderem Job ab" in Dieser Fall bedeutet "wird vollständig gestoppt, bevor ein anderer Job zu stoppen beginnt".

Ich bin mir nicht sicher, welche der beiden Möglichkeiten die bessere ist ...

0
Binarus