mikrocontroller.net

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.
Autor: BashDresh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#! /bin/bash
if [ -f /backuper/inprogress ];then 
echo "Backup läuft schon - Beende Cronetab script" 
else 
echo "Starte neues Backup"
echo "Starte neues Backup" > /backuper/inprogress
#Grüne LED an
echo "ON" > /backuper/LED_GREEN
echo "OFF" > /backuper/LED_YELLOW
#Mounte Dislocker Laufwerk, wenn ein USB Device angeschlossen ist
/backuper/autodislocker.sh
if [! -d  /backuper/dismount ]; then
#Dislocker mount schiefgegangen, oder kein Laufwerk vorhanden
rm -f /backuper/inprogress
#Beide LEDs aus
echo "OFF" > /backuper/LED_GREEN
echo "OFF" > /backuper/LED_YELLOW
break    
else
#Beide LEDs an
echo "ON" > /backuper/LED_GREEN
echo "ON" > /backuper/LED_YELLOW
#Starte neuen Screen, welcher das Backup ausführt.    
screen -mS backup /backuper/autohddrsync.sh
#Backup fertig. Lösche die inprogress Datei
rm -f /backuper/inprogress
#Beide LEDs aus
echo "OFF" > /backuper/LED_GREEN
echo "OFF" > /backuper/LED_YELLOW    
fi   
fi

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: BashDresh (Gast)
Datum:

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

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man bash

dort das "trap"-Kommando suchen

Autor: BashDresh (Gast)
Datum:

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

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marten Morten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#!/bin/bash

# Place lock file in /tmp, because /tmp is deleted when the system
# reboots, so it gets cleaned up automatically should the system crash
LOCKFILE=/tmp/$(basename "$0").lock

TWAIT=20

echo "${$}: Running"
(
        flock -w $TWAIT -x $FD || {
                echo "${$}: Can't acquire lock, exiting"
                exit 1
        }

        echo "${$}: Lock acquired, doing stuff under lock ..."
        sleep 5 # replace with real task

        # To test premature exit behavior insert
        #    kill -9 $$ $BASHPID
        # here. I.e. don't let the subshell terminate naturally

        echo "${$}: Done doing stuff under lock"
) {FD}>$LOCKFILE

# Lock is auto-dropped, because subshell terminated and closed the
# lock file
echo "${$}: Lock dropped"
echo "${$}: Doing stuff outside lock ..."
sleep 5
echo "${$}: Done."

Autor: Marten Morten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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