Forum: PC Hard- und Software Was machen, wenn Bash Script mit "Errinnerung" abgebrochen wird


von BashDresh (Gast)


Lesenswert?

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.    
24
screen -mS backup /backuper/autohddrsync.sh
25
#Backup fertig. Lösche die inprogress Datei
26
rm -f /backuper/inprogress
27
#Beide LEDs aus
28
echo "OFF" > /backuper/LED_GREEN
29
echo "OFF" > /backuper/LED_YELLOW    
30
fi   
31
fi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.).

: Bearbeitet durch Moderator
von BashDresh (Gast)


Lesenswert?

Was bewirkt "trap 'rm -f /backuper/inprogress' INT QUIT TERM HUP" ?????

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

man bash

dort das "trap"-Kommando suchen

von BashDresh (Gast)


Lesenswert?

OK. Das sieht schon recht gut aus.
Danke für die Infos :-)

von guest (Gast)


Lesenswert?

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.

von Marten Morten (Gast)


Lesenswert?

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
27
# lock file
28
echo "${$}: Lock dropped"
29
echo "${$}: Doing stuff outside lock ..."
30
sleep 5
31
echo "${$}: Done."

von Marten Morten (Gast)


Lesenswert?

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:
1
trap 'rm -f /backuper/inprogress' EXIT

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.