
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 im freigegebenen Ordner zu speichern, damit ich sie verwenden kann, wenn 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 die beste Möglichkeit ist, 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, damit eine der Berührungen nach dem Ruhezustand funktioniert? Oder gibt es einen einfacheren Weg, dies zu erreichen?
Dank im Voraus.
Antwort1
DerUpstart-Einführung, Cookbook und Best Practicesverfügt über zahlreiche Codefragmente, die Sie zum Erstellen von Upstart-Aufgaben und -Jobs verwenden können.
DerHerunterfahrenAbschnitt des Kochbuchs besagt, dass /etc/init/rc.conf
ausgeführt wird und aufgerufen wird /etc/init.d/rc
. Dies wiederum wird schließlich aufrufen /etc/init.d/sendsigs
. Wenn Sie also start on starting rc
dann Ihre Aufgabe ausführen, bevor rc (und die Sigterms, die den Prozess normalerweise beenden würden) ausgeführt 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
Antwort2
Ich glaube, das geht nicht überEmporkömmling, als die/etc/init.d/sendsigsSkript, das aufgerufen wird durchEmporkömmlingBeim Anhalten/Neustarten werden alle Prozesse ( killall5 -9
) innerhalb von 10 Sekunden beendet, und selbst wenn dies nicht gelingt, wird alles ausgehängt und das System heruntergefahren.
Am besten verwenden Sie den rostigen/etc/init.dStilskripte.
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 densendsigsSkript auf den Runleveln 0 bis 6 (Herunterfahren, Neustart). Dieses Beispielskript zeichnet das Datum auf, schläft dann 20 Sekunden lang und zeichnet dann das Datum erneut auf, um/root/s.log.)
Mehr Info: