Was machen, wenn Bash Script mit "Errinnerung" abgebrochen wird

Gast #6020229
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
Moderator Persönliche Seite #6020234
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.).
Gast #6020305
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.
Gast #6020340
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."

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren