Hallo Leute,
Mit einem Cronetab möchte ich ein Backupscript menütlich aufrufen.
Das Script hat eine "Erinnerung", das es bereits läuft, damit es kein
zweites mal gestartet wird.
Nun stellt sich mir die Frage, was passiert, wenn das Script abbricht,
oder der RPI neu gestartet wird.
Dann wird das Script ja nie wieder ausgeführt!
Wie gehe ich da am besten vor?
Täglich ein zweites "Watchdog" script ausführen?
Das Pseudoscript sieht jetzt wie folgt aus:
1
#! /bin/bash
2
if[-f /backuper/inprogress ];then
3
echo"Backup läuft schon - Beende Cronetab script"
4
else
5
echo"Starte neues Backup"
6
echo"Starte neues Backup"> /backuper/inprogress
7
#Grüne LED an
8
echo"ON"> /backuper/LED_GREEN
9
echo"OFF"> /backuper/LED_YELLOW
10
#Mounte Dislocker Laufwerk, wenn ein USB Device angeschlossen ist
11
/backuper/autodislocker.sh
12
if[!-d /backuper/dismount ];then
13
#Dislocker mount schiefgegangen, oder kein Laufwerk vorhanden
14
rm-f /backuper/inprogress
15
#Beide LEDs aus
16
echo"OFF"> /backuper/LED_GREEN
17
echo"OFF"> /backuper/LED_YELLOW
18
break
19
else
20
#Beide LEDs an
21
echo"ON"> /backuper/LED_GREEN
22
echo"ON"> /backuper/LED_YELLOW
23
#Starte neuen Screen, welcher das Backup ausführt.
BashDresh schrieb:> Nun stellt sich mir die Frage, was passiert, wenn das Script abbricht,> oder der RPI neu gestartet wird.
Gegen den Abbruch hilft ein
trap 'rm -f /backuper/inprogress' INT QUIT TERM HUP
ganz oben im Script.
Gegen den Neustart hilft es, irgendwo in den Systemstart-Scripten das rm
unterzubringen. Die meisten Linux-Distros honorieren auch die Existenz
eines /etc/rc.local, und arbeiten dieses irgendwann während des
Systemstarts ab. Eine solche Datei anzulegen und das rm da hinein zu
schreiben wäre wohl die quick&dirty-Variante, ohne dass man nun erst
aufwändig irgendwelche Pseudo-Services erfinden muss, die man in die
Startup-Sequenz einbindet (je nach init, systemd etc. pp.).
Jörg W. schrieb:> Gegen den Neustart hilft es, irgendwo in den Systemstart-Scripten das rm> unterzubringen.
Dagegen würde auch helfen die entsprechende Datei in eine Ramdisk zu
legen. AFAIK wäre /run auf dem Pi wohl der passende Ort. Und
typischerweise würde man dort auch die PID reinschreiben und nicht
irgendeinen Text. Ein zusätzliches Watchdog-Script könnte dann zur
Sicherheit z.B. regelmäßig schauen, ob der Prozess überhaupt noch läuft.
BashDresh schrieb:> Das Script hat eine "Erinnerung", das es bereits läuft, damit es kein> zweites mal gestartet wird.>> Nun stellt sich mir die Frage, was passiert, wenn das Script abbricht,> oder der RPI neu gestartet wird.> Dann wird das Script ja nie wieder ausgeführt!> Wie gehe ich da am besten vor?
Zusehen dass die "Erinnerung" (der Lock), der parallele Ausführungen
verhinder soll, sauber aufgeräumt wird. trap ist dabei nur bedingt
hilfreich:
1
#!/bin/bash
2
3
# Place lock file in /tmp, because /tmp is deleted when the system
4
# reboots, so it gets cleaned up automatically should the system crash
5
LOCKFILE=/tmp/$(basename"$0").lock
6
7
TWAIT=20
8
9
echo"${$}: Running"
10
(
11
flock -w $TWAIT -x $FD || {
12
echo "${$}: Can't acquire lock, exiting"
13
exit 1
14
}
15
16
echo "${$}: Lock acquired, doing stuff under lock ..."
17
sleep 5 # replace with real task
18
19
# To test premature exit behavior insert
20
# kill -9 $$ $BASHPID
21
# here. I.e. don't let the subshell terminate naturally
22
23
echo "${$}: Done doing stuff under lock"
24
) {FD}>$LOCKFILE
25
26
# Lock is auto-dropped, because subshell terminated and closed the
Noch was zu trap:
Jörg W. schrieb:> BashDresh schrieb:>> Nun stellt sich mir die Frage, was passiert, wenn das Script abbricht,>> oder der RPI neu gestartet wird.>> Gegen den Abbruch hilft ein>> trap 'rm -f /backuper/inprogress' INT QUIT TERM HUP
Den Klimbim kann man sich in der bash größtenteils sparen:
Eine eigene Frage?
Dieser Thread ist über 7 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.