ubuntuusers.de

Cron startet Backup-Script mehrfach

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

homer77

Avatar von homer77

Anmeldungsdatum:
8. Januar 2007

Beiträge: 189

Wohnort: Münster

Hallo zusammen,

Ich doktere seit einigen Wochen an einem mir unerklärlichen Problem herum und konnte weder über googlen noch über ducken eine Erklärung finden.

Ich betreibe einen kleinen Cloud-Server mit einem Raspberry Pi und Debian Wheezy (Raspbian) drauf. Auf eine über ein Hub angeschlossene externe Festplatte führe ich mittels eines selbstgeschriebenen Skripts täglich ein Backup mit duplicity durch.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash                                                                                       

# Sicherstellen, dass die Festplatte gemountet ist                                                
mount -a
if [ $? -ne 0 ]
    then
    echo "Das Einhängen der externen Festplatte ist fehlgeschlagen."
    echo "daily_backup bricht ab!"
    exit 1
fi

# Entferne Backups, die älter als 6 Monate sind                                                   
PASSPHRASE="MEINPASSWORT" duplicity remove-older-than 6M file:///media/BACKUP/raspi/
if [ $? -ne 0 ]
    then
    echo "duplicity beendete mit Exit-Status 1."
    echo "daily_backup bricht ab!"
    exit 1
fi

# Backup auf externer Festplatte                                                                  
PASSPHRASE="MEINPASSWORT" duplicity --full-if-older-than 1M \
--verbosity 2 \
--include /etc --include /home --include /root --include /var/lib/mysql --include /var/mail --inc\
lude /var/www \
--exclude '**' \
/ file:///media/BACKUP/raspi/

# >>/home/homer77/daily_backup_log                                                                
if [ $? -ne 0 ]
    then
    echo "Die Sicherung ist gescheitert!"
    echo "daily_backup wurde abgebrochen."
    mail -s "[daily_backup report] Fehlschlag!" homer77 < "Die Sicherung mit duplicity ist gesche\
itert."
else
    echo "Die Sicherung war erfolgreich!"
    tail -n20 /home/homer77/daily_backup_log | mail -s "[daily_backup report] Sicherung erfolgrei\
ch!" homer77
fi

Von Hand durchgeführt funktioniert das Skript problemlos. Probleme bereitet hingegen die Automatisierung via cronjob, der das Skript jede Nacht um 4 Uhr starten soll.

1
# sudo crontab -l

gibt gekürzt Folgendes aus:

1
2
3
4
# m h  dom mon dow   command

*/15 * * * * /usr/bin/php -f /var/www/owncloud/cron.php
* 4 * * * /usr/bin/daily_backup >> /home/homer77/daily_backup_log

Das Skript wird auch erfolgreich zu diesem Zeitpunkt gestartet - so weit so gut, aber ab dann läuft's leider schräg:

Statt das Skript zu starten, abzuarbeiten und gut ist's, startet cron das Skript etwa minütlich, wodurch ich am nächten Morgen kaum noch auf den Server zugreifen kann, weil etwa 60 duplicity-Prozesse in der Luft hängen und sich gegenseitig und das ganze Gerät blockieren.

Ich schnall's nicht! Bedeutet meine Zeile im crontab nicht, dass der Prozess genau einmal um 4 Uhr startet? Ich hab doch nicht geschrieben "in der Stunde 4 jede Minute". Oder hab ich die cron-Syntax irgendwie missverstanden?

Für sachdienliche Hinweise, die zur Ergreifung des Bugs führen, wäre ich Euch jedenfalls sehr dankbar ☺

xubuntufriese

Avatar von xubuntufriese

Anmeldungsdatum:
3. Mai 2014

Beiträge: 340

homer77 schrieb:

Ich schnall's nicht! Bedeutet meine Zeile im crontab nicht, dass der Prozess genau einmal um 4 Uhr startet? Ich hab doch nicht geschrieben "in der Stunde 4 jede Minute".

Doch.

Oder hab ich die cron-Syntax irgendwie missverstanden?

Ja.

0 4 * * * /usr/bin/daily_backup >> /home/homer77/daily_backup_log

startet genau um 04:00 einmal

* 4 * * * /usr/bin/daily_backup >> /home/homer77/daily_backup_log

startet um 04:00, 04:01, .....

homer77

(Themenstarter)
Avatar von homer77

Anmeldungsdatum:
8. Januar 2007

Beiträge: 189

Wohnort: Münster

BOING! Tausend und Einen Dank!

Da hatte ich mir die Antwort ja eigentlich selber schon gegeben ... nur eben nicht verstanden ... Wenn man es vor der Nase hat, erschließt sich eigentlich auch direkt, warum du natürlich völlig Recht hast ... 🙄 Ich entferne mal eben das Brett vom Kopf und freue mich über eine endlich laufende Backup-Lösung.

Nochmals Danke!

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

Da Du vermutlich nicht möchtest, dass die Backups alle parallel laufen, kannst Du das auch innerhalb des Skriptes verhindern. Hier ist z.B. eine Lösung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/sh

test -n "$DEBUG" && set -x

cmd="$(basename "$0")"
pidfile="/var/run/$cmd"

if { pid=$(cat "$pidfile") && kill -0 $pid; } 2>/dev/null; then
  echo "ERROR: already running with pid $pid - exiting." >&2
  exit 1
fi

trap "rm -f '$pidfile'" 0
echo $$ >|"$pidfile"

# Simulate work
echo "running as $$"
sleep 5

Beispiel:

$ for i in {1..5}; do ./x.sh & sleep 1; done
[1] 5592
running as 5592
[2] 11028
ERROR: already running with pid 5592 - exiting.
[2]+  Exit 1                  ./x.sh
[2] 6980
ERROR: already running with pid 5592 - exiting.
[2]+  Exit 1                  ./x.sh
[2] 9384
ERROR: already running with pid 5592 - exiting.
[2]+  Exit 1                  ./x.sh
[2] 9232
ERROR: already running with pid 5592 - exiting.
[1]-  Done                    ./x.sh
[2]+  Exit 1                  ./x.sh 

Ich poste später noch mal eine sicherere Lösung mit flock.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13209

Ist nicht nur robuster, sondern sogar eleganter:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh

test -n "$DEBUG" && set -x

cmd="$(basename "$0")"
lockfile="/var/run/$cmd"

exec 9<>"$lockfile"

flock -n 9 || {
  echo "ERROR: already running $(cat <&9) - exiting." >&2
  exit 1
}

echo $$ >&9

echo "running as $$"
sleep 5
echo "finished $$"

😀

Antworten |