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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.