ubuntuusers.de

rsync arbeitet, stoppt aber ein Bash-Script

Status: Gelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

herakles

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Moin!

Ich habe einen Server, der headless seine Dienste verrichtet. Auf diesem lagere ich auch einige private Daten, die ich gern von Zeit zu Zeit sichern möchte auf einer externen Festplatte. Über udev habe ich es so eingerichtet, dass beim Anstecken einer externen USB-Backup Platte ein automatisches Backup mit srync startet:

1
2
cat udev/rules.d/backup-usb.rules
KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1058", ATTRS{idProduct}=="1110", SYMLINK+="backup", ACTION=="add", RUN+="/usr/bin/logger Starte Backup.", RUN+="/root/backup_to_usb_disk.sh"

Soweit, so gut. Allerdings bricht mein Script immer direkt nach dem rsync ab. Das erkenne ich daran, dass die Meldungen im syslog stehts bei "Backup 5" aufhören:

1
2
3
4
5
6
root@testrechner:/etc# grep Backup /var/log/syslog
Mar  9 09:01:54 testrechnerlogger: Starte Backup.
Mar  9 09:02:07 testrechnerlogger: Backup 1
Mar  9 09:02:07 testrechnerlogger: Backup 2
Mar  9 09:02:07 testrechnerlogger: Backup 3
Mar  9 09:02:07 testrechnerlogger: Backup 5

Wie in dem folgenden Script ersichtlich, ist das genau NACH dem rsync:

 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
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/bash
sleep 5
SENDER_ADDRESS="root@test.de"
LOGIN_USER="test_11"
LOGIN_PASS="12345678"
RECEIVER_ADDRESS="root@test.de"
SEND_EMAIL="/usr/local/bin/sendEmail"
MOUNT_POINT="/usb_backup"
USB_PARTITION=`/usr/bin/lshw -short | grep "930GiB EXT4 volume" | awk '{printf $2}'`
DATE=`date`
RSYNC_PID=`pidof rsync`
/usr/bin/logger "Backup 1"
if [ -n "$RSYNC_PID" ]; then
        # rsync is already running somewhere, therefore quit without telling. we do not want multiple instances of rsync running.
/usr/bin/logger "Backup 1a"
        exit 0
fi
if [ -z "$USB_PARTITION" ]; then
        # no HDD found on USB port, quit without telling anyone. this will happen frequently.
/usr/bin/logger "Backup 1b"
        exit 0
fi
/usr/bin/logger "Backup 2"
mount $USB_PARTITION $MOUNT_POINT
RET=$?
/usr/bin/logger "Backup 3"
if [ $RET -ne 0 ]; then
        MAIL_SUBJECT="Unable to mount USB"
        MAIL_MESSAGE="Could not mount USB device at $DATE, error code: $RET"
/usr/bin/logger "Backup 4"
else
/usr/bin/logger "Backup 5"
        /usr/bin/rsync -az --delete --exclude="/proc" --exclude="/dev" --exclude="/mnt" --exclude="/tmp" --exclude="/lost+found" --exclude="/sys" --exclude="/usb_mirror" --exclude="${MOUNT_POINT}" / ${MOUNT_POINT}
/usr/bin/logger "Backup 5a"
        RET=$?
RET=0
/usr/bin/logger "Backup 6"
        if [ $RET -ne 0 ]; then
/usr/bin/logger "Backup 7"
                MAIL_SUBJECT="Failure on rsync!"
                MAIL_MESSAGE="rsync at $DATE to USB failed: $RET !"
        else
/usr/bin/logger "Backup 8"
                MAIL_SUBJECT="rsync done!"
                MAIL_MESSAGE="rsync at $DATE to USB done !"
        fi
/usr/bin/logger "Backup 9"
        umount $MOUNT_POINT
fi
/usr/bin/logger "Backup 10"
${SEND_EMAIL} -f ${SENDER_ADDRESS} -t ${RECEIVER_ADDRESS} -m $MAIL_MESSAGE -u $MAIL_SUBJECT -s mail.test.de:25 -xu ${LOGIN_USER} -xp ${LOGIN_PASS}
/usr/bin/logger "Backup fertig!"
exit 0

Nun könnte man meinen, dass rsync eben lange braucht und deshalb die nächste logger-Meldung noch nicht zu sehen ist, allerdings bleibt der Status auch über eine Nacht erhalten und ich sehe auch keinen rsync-Prozess mehr in der Prozesstabelle.

Ein händisch auf der Konsole gestartetes rsync gemäß der Zeile in meinem Script läuft voll durch und liefert als return-value auch eine "0".

Sieht irgendwer, wo mein Fehler liegt?

Für jeden Tipp wäre ich sehr dankbar.

Viele Grüße Herakles

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21836

Wohnort: Lorchhausen im schönen Rheingau

Wenn etwas mit cron oder udev nicht geht, würd ich als erstes immer mal in leerem environment testen 😉

also

1
2
sh
env -i dein_befehl_hier

Evtl kann sh nichts mit ${variable} anfangen

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11250

Wohnort: München

Lenke doch mal die Ausgabe vom rsync-Aufruf in Zeile 33 mit einem angehängten

 &>> /var/log/rsync_backup.log

in eine Logdatei um, vielleicht sieht man da etwas. Was ist der Sinn von Zeile 35/36? Der logger-Befehl in Zeile 34 dürfte ja kaum Fehlschlagen und dann wird der Wert sowieso auf 0 gesetzt ...

herakles

(Themenstarter)

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Hi!

Also, wenn ich es mache, wie von redknight beschrieben, arbeitet es sauber bis zum Ende durch. Allerdings bringt mir das ja leider nichts im Produktivsystem, nur zur Fehlersuche. Fehlersuche ist grundsätzlich ein gutes Stichwort, denn wie schon von seahawk1986 angemerkt, bringen natürlich 34-36 herzlich wenig. sollte man zumindest meinen. Die Return-value setze ich nur kurz zurück, damit sie auf jeden Fall "0" ist, da ich noch am debuggen bin, DENN: der Befehl in Zeile 34 kehrt nicht zurück. Genau das ist ja mein Problem. Im syslog sehe ich den Eintrag "Backup 5a" niemals.

Ich habe nun auch einmal den output von rsync auf "verbose" gestellt (Option -v) und es nach /var/log/rsync.log gepiped. Ergebnis: Der Befehl wird offenbar erfolgreich abgearbeitet:

1
2
3
4
5
6
7
(...)
var/log/exim4/mainlog
var/log/samba/log.nmbd
var/log/samba/log.smbd

sent 12,807,282,998 bytes  received 205,623 bytes  5,163,268.95 bytes/sec
total size is 795,673,635,109  speedup is 62.13

Und dennoch erscheint das "Backup 5" niemals in meinem syslog. Genau das ist ja mein Problem. rsync arbeitet offenbar völlig normal durch, aber mein Script läuft an der Stelle einfach nicht weiter.

Ideen?

Grüße Herakles

herakles

(Themenstarter)

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Des Rätsels Lösung: Offenbar produziert rsync zuviel output, dass das Bash-Script weiterhin sauber laufen kann. Ich habe die Ausgabe von rsync mit der Option "-q" abgeschaltet und nun funktioniert es sauber.

Grüße Herakles

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21836

Wohnort: Lorchhausen im schönen Rheingau

Danke für das veröffentlichen. Das war mir so auch nicht bewusst.

herakles

(Themenstarter)

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Mein Antwortpost stimmte nicht ganz. Ich habe soeben herausgefunden, dass nur ein wegpipen im Wege von "> /dev/null" die Funktion erhält. Nur ein "-q" hat allein nicht immer geholfen.

Grüße Herakles

herakles

(Themenstarter)

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Moin!

Das Problem besteht leider weiterhin. Sollte noch irgendwer eine Idee haben, was ich probieren könnte oder verbessern könnte, bin ich für jeden Hinweis dankbar!

Viele Grüße Herakles

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11250

Wohnort: München

Produziert rsync vielleicht auf stderr noch zu viele Ausgaben? Mittels

> /dev/null

leitest du ja nur stdout nach /dev/null um. Leite stderr doch mal mit nach /dev/null um (oder lass es in eine Datei schreiben, damit man sieht, warum es da so viele Meldungen gibt):

2>&1 /dev/null

herakles

(Themenstarter)

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Hallo!

Diese Idee hat mir leider nicht geholfen, weil die so erstelle Logdatei leer ist. Es gibt also keine Fehlermeldungen auf stderr. rsync selbst rufe ich inzwischen mit "--log-file=/var/log/rsync_backup.log" auf. In der Datei kann ich eine erfolgreiche Beendigung von rsync erkennen:

1
2
(...)
2016/05/18 16:10:03 [1783] sent 123,761,451 bytes  received 268,138 bytes  total size 834,584,145,634

So langsam gehen mir die Ideen aus...

Grüße Herakles

herakles

(Themenstarter)

Anmeldungsdatum:
6. November 2006

Beiträge: 74

Ich habe nun eine Lösung, die offenbar funktioniert. Und zwar bemerke ich, dass eine Festplatte für die Spiegelung mit rsync angeklemmt wurde über udev. Deshalb gibt es eine udev-Regel:

1
2
# vim /etc/udev/rules.d/backup-usb.rules
KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1058", ATTRS{idProduct}=="1110", ATTRS{serial}=="574341563535313230303136", SYMLINK+="backup", ACTION=="add", RUN+="/bin/mount /dev/%k /usb_backup", RUN+="/usr/bin/logger Starte Backup.", RUN+="/root/udev_starter_backup_to_usb_disk.sh"

Nun lasse ich udev nicht das eigentlich Backupt-script starten, sondern ein eigenes kleines Script mit diesem kurzen Inhalt:

1
2
3
# vim udev_starter_backup_to_usb_disk.sh
#!/bin/bash
/root/backup_to_usb_disk.sh & exit 0

Und in /root liegt dann das eigentliche Backup-script. So scheint es nach mehrmaligen Versuchen zu funktionieren.

Sollte sich an meinem "Erfolg" noch was ändern, melde ich mich hier.

Grüße Herakles

Antworten |