Wie konfiguriere ich upstart so, dass beim Herunterfahren ein Skript ausgeführt wird, wenn der Vorgang länger als 10 Sekunden dauert?


11

Ich verwende Ubuntu 11.10 in einer virtuellen Maschine (VirtualBox), um mehr über die Entwicklung unter Linux zu erfahren. Ich verwende ein Git-Repository, um meine Arbeit zu speichern, und habe ein Skript geschrieben, um meine Arbeit zu bündeln und zur Verwendung im freigegebenen Ordner zu speichern, während die virtuelle Maschine nicht ausgeführt wird.

Ich möchte dieses Skript vor dem Herunterfahren automatisch ausführen, damit meine Arbeit immer verfügbar ist, wenn die VM ausgeschaltet ist (derzeit muss ich das Skript manuell ausführen).

Ich weiß nicht, ob Upstart der beste Weg ist, um dies zu erreichen, aber dies ist die Konfiguration, die ich als Test geschrieben habe:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

Das Ergebnis ist, dass nur eine Berührung ausgeführt wird (die erste Berührung vor dem Start). Was muss ich ändern, um eine der Berührungen nach dem Schlafengehen zu sehen, um zu arbeiten? Oder gibt es einen einfacheren Weg, dies zu erreichen?

Danke im Voraus.

Antworten:


7

Das Upstart-Intro, das Kochbuch und die Best Practices enthalten eine große Anzahl von Codefragmenten, die zum Erstellen von Upstart-Aufgaben und -Jobs verwendet werden können.

Der Abschnitt zum Herunterfahren des Kochbuchs besagt, dass /etc/init/rc.confdieser ausgeführt und aufgerufen wird /etc/init.d/rc. Dies wird wiederum irgendwann anrufen /etc/init.d/sendsigs. Wenn Sie dies start on starting rctun, wird Ihre Aufgabe vor rc ausgeführt (und die Sigtermen, bei denen der Prozess normalerweise heruntergefahren wird).

Datei: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

Datei: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

1
Dieser Frage wurde ein konkretes Beispiel hinzugefügt, das jedoch nicht funktioniert (beim Herunterfahren wird nur die erste Berührung ausgeführt), obwohl in der Dokumentation unter Erstellen eines Ereignisalias angegeben ist , dass dies der Fall sein sollte. Bitte schauen Sie es sich an und sehen Sie, ob ich einen Fehler gemacht habe.
Tiris

Tiris, das sollte funktionieren. Ich würde gerne Ihr / var / log / syslog nach dem Neustart sehen, insbesondere um zu sehen, ob der Testprozess durch einen Neustart gewaltsam abgebrochen wurde.
SpamapS

1
Die letzte Bearbeitung dieser Antwort funktioniert. Überprüfen Sie den Versionsverlauf, um das problematische Kind zu sehen. Ich denke, ich hätte kommentieren sollen, dass ich eine Bearbeitung vorgenommen habe (oder ist es besser, den Kommentar zu entfernen und einen neuen hinzuzufügen? Gibt es eine Stackexchange-Etikette?). Mich würde interessieren, warum das Sorgenkind nicht funktioniert (da die Dokumentation dies vorschreibt).
Tiris

Was genau bedeutet die Datei test.conf? Mache ich eine Datei mit dem Namen test.conf oder füge ich diese zu rc.conf hinzu?
Henryville

@heneryville test.confist nur ein zufälliger Dateiname. Sie könnten genauso einfach verwenden whatEverYouWant.conf. Ihr Kommentar zeigt auch, dass Sie das in der Antwort erwähnte "Kochbuch" nicht gelesen haben. Wenn Sie in Abschnitt 4.2 nachsehen, wird die Jobkonfigurationsdatei ausführlicher erläutert.
Tiris

7

Ich denke, dies kann nicht über Upstart erfolgen , da /etc/init.d/sendsigs Skript , das von Upstart beim Anhalten / Neustarten aufgerufen wird , alle Prozesse ( killall5 -9) innerhalb von 10 Sekunden und selbst wenn dies nicht erfolgreich ist, funktioniert es zum Abhängen und Herunterfahren.

Der beste Weg wäre, die rostigen Skripte /etc/init.d zu verwenden .

Beispiel: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

Aktivieren Sie dann das Skript

sudo update-rc.d shutdown_job start 19 0 6 .

Dadurch wird das Skript vor das Sendsigs- Skript auf Runlevel 0 bis 6 gestellt (Herunterfahren, Neustart). Dieses Beispielskript zeichnet das Datum auf, schläft dann 20 Sekunden lang und zeichnet dann das Datum erneut auf /root/s.log auf .)

Mehr Info:


Ich bin überhaupt nicht damit vertraut. Gibt es einen guten Leitfaden, um dies zum Laufen zu bringen? Bitte bearbeiten Sie mit weiteren Informationen.
Tiris

Ich habe das ausprobiert und es funktioniert nicht (na ja, nicht genau). Ich habe ein touch /media/sf_LinuxEducation/startund touch /media/sf_LinuxEducation/start-longdirekt neben den Datumsbefehlen hinzugefügt . Die Daten werden protokolliert, aber die Berührungen werden nicht berührt. Ich frage mich daher, ob dieses Laufwerk zum Zeitpunkt der Ausführung des Skripts nicht bereitgestellt ist. Ich denke, es könnte etwas mit dem NN-Argument zu tun haben, obwohl ich nicht sicher bin, wie dieses Argument wirklich funktioniert (die Manpage erklärt es auf eine sehr umwerfende Art und Weise). Woher wissen Sie, welche Zahl (oder welches Zahlenpaar) in diesem Argument festgelegt werden soll?
Tiris

Skripte werden gemäß ihrer Nummer ausgeführt, wie beim Auflisten des Verzeichnisses /etc/rc6.dangezeigt. Das Skript zum Herunterfahren von 19 sollte also ausgeführt worden sein, bevor die Bereitstellung aufgehoben wird (> 31). Aber warum versuchen Sie nicht Ihre Hypothese und berühren /rootstattdessen eine Datei ?
arrangieren

Ein Blick in das Verzeichnis /etc/rc6.dzeigt, dass die freigegebenen Ordner mit dem K70vboxaddSkript ein- und ausgehängt werden . Würde das Ändern des NN-Arguments (für mein Skript) in 71 dazu führen, dass mein Skript vor dem Aufheben der Bereitstellung von freigegebenen VB-Ordnern ausgeführt wird? Ich werde es später heute versuchen.
Tiris

Nun, das hat nicht funktioniert. Update: Ich habe touch /root/startvor dem sleep 20Befehl ein hinzugefügt und es wird keine Datei erstellt. Ich weiß nicht einmal, wo ich anfangen soll, um herauszufinden, warum. Die Daten werden gerne zur /root/s.logDatei hinzugefügt. Warum kann ich eine Datei nicht berühren?
Tiris
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.