• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] rsnapshot wird 2x gestartet

norritt

Member
Hallo zusammen,

ich habe mein Backupsystem überarbeitet und benutze nun rsnapshot zum regelmäßigen Erstellen von Sicherungen. Ich habe zwei Sicherungsziele genannt "Besekammer" und "Home". Ersteres funktioniert wie erwartet zweiteres, schlägt fehlt weil es schreinbar mehrfach parallel ausgeführt wird, mir ist aber absolut nicht klar warum. Zunächst ein Auszug aus meiner crontab:

Code:
# backup daily except sunday and 1st of the month
0 6 2-31 * 1-6 /root/scripts/backup/rsnapshot_besenkammer.sh daily
55 6 2-31 * 1-6 /root/scripts/backup/rsnapshot_home.sh daily
# backup weekly on sunday except 1st of the month
0 6 2-31 * 0  /root/scripts/backup/rsnapshot_besenkammer.sh weekly
55 6 2-31 * 0  /root/scripts/backup/rsnapshot_home.sh weekly
# backup monthly on the 1st day the month
0 6 1 * * /root/scripts/backup/rsnapshot_besenkammer.sh monthly
55 6 1 * * /root/scripts/backup/rsnapshot_home.sh monthly

Der Job für Besenkammer läuft wie gesagt problemlos durch, der für home erzeugt jedoch für Fehler ich erhalte 2! Mails von cron mit:

Betreff: Cron <root@cube> /root/scripts/backup/rsnapshot_home.sh daily
Code:
Setting locale to POSIX "C"
----------------------------------------------------------------------------
rsnapshot encountered an error! The program was invoked with these options:
/usr/bin/rsnapshot -c /root/scripts/backup/rsnapshot.home.conf daily 
----------------------------------------------------------------------------
ERROR: Lockfile /var/run/rsnapshot.home.pid exists and so does its process, can not continue
/usr/bin/logger -i -p user.err -t rsnapshot /usr/bin/rsnapshot -c \
    /root/scripts/backup/rsnapshot.home.conf daily: ERROR: Lockfile \
    /var/run/rsnapshot.home.pid exists and so does its process, can not \
    continue

Betreff: Cron <root@cube> /root/scripts/backup/rsnapshot_home.sh weekly
Code:
USB set configuration Device or resource busy
mount: /dev/sdd1 is already mounted or /mnt/backup_home busy
       /dev/sdd1 is already mounted on /mnt/backup_home
Setting locale to POSIX "C"
echo 15970 > /var/run/rsnapshot.home.pid 
/mnt/backup_home/weekly.4 not present (yet), nothing to delete
/mnt/backup_home/weekly.3 not present (yet), nothing to rotate
/mnt/backup_home/weekly.2 not present (yet), nothing to rotate
/mnt/backup_home/weekly.1 not present (yet), nothing to rotate
/mnt/backup_home/weekly.0 not present (yet), nothing to rotate
/mnt/backup_home/daily.6 not present (yet), nothing to copy
rm -f /var/run/rsnapshot.home.pid 
/usr/bin/logger -i -p user.info -t rsnapshot /usr/bin/rsnapshot -c \
    /root/scripts/backup/rsnapshot.home.conf weekly: completed successfully 
umount: /mnt/backup_home/: not mounted

Laut crontab dürften aber beide Jobs niemals zeitgleich gestartet werden, zumindest nicht von cron und vor allem sollte der weekly-Job nur sonntags laufen ich bekomme die Mail aber *jeden* Tag. Hat jemand eine Idee warum?
 

spoensche

Moderator
Teammitglied
Führe das tägliche Backup für /home mal manuell aus und überprüfe, ob das PID File nach dem Durchlauf auch gelöscht wird.

Welche Datenmenge wird denn auf die USB- Platte gesichert? Verwendest du USB 3.0 oder 2.0?

Zu deiner Crontab:

Für die Spalte 5 (Day of Week) kann entweder die 0 oder 7 der Sonntag sein. Verwende statt der Zahl mal Sunday und teste, ob es dann funktioniert.

Überprüfe in deinem Script für /home, ob /dev/sdd1 bereits gemountet ist und auch, ob kein PID- File für das wöchentliche Backup existiert. Da in der letzten Zeile ein fehlgeschlagener umount protokolliert wird, liegt die Vermutung nahe, dass ein anderer Prozess die Partition vorher ausgehängt hat.
 
OP
N

norritt

Member
spoensche schrieb:
Führe das tägliche Backup für /home mal manuell aus und überprüfe, ob das PID File nach dem Durchlauf auch gelöscht wird.

Hier die Ausgabe von einem manuellen Durchlauf:
Code:
# ./rsnapshot_home.sh weekly
Setting locale to POSIX "C"
echo 14291 > /var/run/rsnapshot.home.pid
/mnt/backup_home/weekly.4 not present (yet), nothing to delete
/mnt/backup_home/weekly.3 not present (yet), nothing to rotate
/mnt/backup_home/weekly.2 not present (yet), nothing to rotate
/mnt/backup_home/weekly.1 not present (yet), nothing to rotate
/mnt/backup_home/weekly.0 not present (yet), nothing to rotate
/mnt/backup_home/daily.6 not present (yet), nothing to copy
rm -f /var/run/rsnapshot.home.pid
/usr/bin/logger -i -p user.info -t rsnapshot /usr/bin/rsnapshot -c \
/root/scripts/backup/rsnapshot.home.conf weekly: completed successfully

# ls -l /var/run/*.pid
-rw-r--r-- 1 root  root     5 May 16 16:17 /var/run/cyrus.pid
lrwxrwxrwx 1 root  root    31 May 16 16:17 /var/run/dhcpd.pid -> /var/lib/dhcp/var/run/dhcpd.pid
-rw-r--r-- 1 root  root     5 May 16 16:17 /var/run/httpd.pid
-rw-r--r-- 1 root  root     4 May 16 16:16 /var/run/lvmetad.pid
-rw-r--r-- 1 statd nogroup  5 May 16 16:17 /var/run/rpc.statd.pid
-rw-r--r-- 1 root  root     4 May 16 16:16 /var/run/rsyslogd.pid
-rw------- 1 root  root     5 May 16 16:17 /var/run/sm-notify.pid
-rw------- 1 root  root     4 May 16 16:16 /var/run/sssd.pid
-rw-r--r-- 1 root  root     0 May 28 15:34 /var/run/zypp.pid

Die .pid file ist also gelöscht.

spoensche schrieb:
Welche Datenmenge wird denn auf die USB- Platte gesichert? Verwendest du USB 3.0 oder 2.0?

USB 2.0. Insgesamt sind das mehr als 1.5TB aber da ich rsnapshot verwende und sich innerhalb eines Intervalls nicht so viel ändert, eher wenige MB wenns hoch kommt mal ein paar hundert MB vielleicht.

spoensche schrieb:
Zu deiner Crontab:

Für die Spalte 5 (Day of Week) kann entweder die 0 oder 7 der Sonntag sein. Verwende statt der Zahl mal Sunday und teste, ob es dann funktioniert.

Den Versuch quittiert crontab mit " bad day-of-week errors in crontab file, can't install."

spoensche schrieb:
Da in der letzten Zeile ein fehlgeschlagener umount protokolliert wird, liegt die Vermutung nahe, dass ein anderer Prozess die Partition vorher ausgehängt hat.
Ja genau das ist das Problem. Das Backup-Script hängt die partition ein startet rsnapshot und hängt sie dann auch wieder aus und da es 2x gleichzeitig gestartet wirdfindet die 2te Instanz die Lockfile der ersten Instanz und hängt die Partition dann gleich wieder aus. Das problem lässt sich also umgehen wenn daily und weekly nicht gleichzeitig gestartet werden. Aber bisher habe ich absolut keine Ahnung warum das überhaupt passiert.

Der Einfachheit halber poste ich mal das Script (die Variableninhalte habe ich für den post hier manuell durch Platzhalter ersetzt):
Code:
#!/bin/bash
SOURCE_PATH=<VALUE>
TARGET_PATH=<VALUE>
RSNAPSHOT_CONF=/root/scripts/backup/rsnapshot.besenkammer.conf
OUTLET_NO=4
BACKUP_HOSTNAME=<VALUE>

# find out if a file has been created or modified within the
# last 60 minutes
CREATED=$(find $SOURCE_PATH -cmin -60 | wc -l)
MODIFIED=$(find $SOURCE_PATH -mmin -60 | wc -l)

function reset_power()
{
    # turn power outlet off if it wasn't turned
    # on before backup run.
    if [ $IS_ON -eq 0 ]
    then
        sispmctl -f $OUTLET_NO > /dev/null
    fi
}

# skip backup run if nothing has changed
if [ $CREATED -eq 0 -a $MODIFIED -eq 0 ]
then
    exit
fi

# check if power outlet is turned on already
IS_ON=$(sispmctl -g $OUTLET_NO | grep on | wc -l)


#activate power point if it isn't turned on already
if [ $IS_ON -eq 0 ]
then
    sispmctl -o $OUTLET_NO > /dev/null
fi

#give the drive time to spin up
sleep 15
mount $TARGET_PATH
sleep 15

# only backup if mount has been successful
mountpoint -q $TARGET_PATH
if [ $? -eq 0 ]
then
    rsnapshot -c $RSNAPSHOT_CONF $1
    wait
    umount -l $TARGET_PATH
    wait
    sleep 15
else
    echo "Error mounting ${TARGET_PATH}"
 

spoensche

Moderator
Teammitglied
In der crontab darf nur der abgekürzte Name, z.B. Sun für Sunday verwendet werden.

Bei den "waits" in deinem Script solltest du noch die PID mit angeben, damit wait weiss auf wen es warten soll.
Code:
wait $(pidof rsnapshot)
 
OP
N

norritt

Member
Hey spoensche,

ja mit "Sun" kann ich die crontab installieren. Heute war auch der erste Tag an dem ich keine Fehlermail von cron bekommen habe, wegen des doppelt gestarteten Jobs. Ich behalt das die nächsten Tage mal im Auge und schaue, ob diesen Sonntag tatsöchlich das weekly Backup richtig durchläuft. Danke schonmal für den Tipp!

Ich hab den "Wait"-Befehl mal entsprechend angepasst. Trotzdem nochmal aus Interesse: War es nicht so, dass wenn die pid nicht angegeben wird sich das wait implizit auf den zuletzt gestarteten Befehl bezieht?
 

spoensche

Moderator
Teammitglied
norritt schrieb:
War es nicht so, dass wenn die pid nicht angegeben wird sich das wait implizit auf den zuletzt gestarteten Befehl bezieht?

Nein. Wenn keine PID angegeben wird, dann wird auf alle Kindprozesse gewartet. Sobald ein Kinprozess beendet worden ist, werden alle folgenden Befehle weiter abgearbeitet.
 
OP
N

norritt

Member
Okay, Kommando zurück. Ich hatte am am Tag meines letzten Posts nur die Mail mit der Fehlermeldung von cron übersehen. Die crontab mit "Sun" wird installiert und läuft - allerdings besteht das Problem mit dem doppelt gestarteten rsnapshot nach wie vor.
 

spoensche

Moderator
Teammitglied
Wie sieht das Script für die Sicherung von /home aus? Da tritt ja der Fehler auf und nicht in der Besenkammer.
 
OP
N

norritt

Member
Ist zwar schon ein wenig älter der Thread hier, aber ich habe mittlweile die Lösung gefunden:

Hier nochmal die ursprüngliche (falsche crontab):
Code:
# backup daily except sunday and 1st of the month
0 6 2-31 * 1-6 /root/scripts/backup/rsnapshot_besenkammer.sh daily
55 6 2-31 * 1-6 /root/scripts/backup/rsnapshot_home.sh daily
# backup weekly on sunday except 1st of the month
0 6 2-31 * 0  /root/scripts/backup/rsnapshot_besenkammer.sh weekly
55 6 2-31 * 0  /root/scripts/backup/rsnapshot_home.sh weekly
# backup monthly on the 1st day the month
0 6 1 * * /root/scripts/backup/rsnapshot_besenkammer.sh monthly
55 6 1 * * /root/scripts/backup/rsnapshot_home.sh monthly

Ursache für das Problem:
Und zwar zählt in der Crontab die Vereinigung der ausgewählten Tage des Monats und Wochentage. D.h. "0 6 2-31 * 0" bedeutet der Job wird gestartet an jedem 2 bis 31 Kalendertag oder (nicht und!) falls der Wochentag ein Sonntag ist.

Damit die täglichen Jobs also nur Werktags, an Kalendertagen zwischen 2 und 31 und die wöchentlichen Jobs nur Sonntags laufen, musste ein kleiner Hack helfen. Und zwar habe ich dem eigentlichen Jobaufruf die Anweisung:

Code:
[ $(date +\%e) -ne 1 ] && ...

vorangestellt. Dieser Ausdruck prüft zunächst, ob der Tag des Monats "1" ist, falls nicht schlägt die Bedingung fehl und der Jobaufruf wird nicht ausgeführt. Die Crontab müsste also so aussehen:
Code:
# backup daily except sunday and 1st of the month
0 6 * * 1-6            [ $(date +\%e) -ne 1 ] && /root/scripts/backup/rsnapshot_besenkammer.sh daily
55 6 * * 1-6           [ $(date +\%e) -ne 1 ] && /root/scripts/backup/rsnapshot_home.sh daily
# backup weekly on sunday except 1st of the month
0 2 * * 7              [ $(date +\%e) -ne 1 ] && /root/scripts/backup/rsnapshot_besenkammer.sh weekly
55 2 * * 7             [ $(date +\%e) -ne 1 ] && /root/scripts/backup/rsnapshot_home.sh weekly
# backup monthly on the 1st day the month
0 6 1 * * /root/scripts/backup/rsnapshot_besenkammer.sh monthly
55 6 1 * * /root/scripts/backup/rsnapshot_home.sh monthly
 
A

Anonymous

Gast
norritt schrieb:
Ursache für das Problem:
Und zwar zählt in der Crontab die Vereinigung der ausgewählten Tage des Monats und Wochentage. D.h. "0 6 2-31 * 0" bedeutet der Job wird gestartet an jedem 2 bis 31 Kalendertag oder (nicht und!) falls der Wochentag ein Sonntag ist.

oder wie es seit Jahr und Tag schon in der Manpage von crontab(5) steht.
Note: The day of a command's execution can be specified in the following two fields — 'day of month', and 'day of week'. If both fields are restricted (i.e., do not contain the "*" character), the command will be run when either field matches the current time. For example,
"30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
im Normalfall sollte also mindestens bei Tag oder Wochentag " * " stehen. Übrigens ist sowas auch immer wieder mal eine gerne genommene Gemeinheit bei Linux Zertifikats Prüfungen.

robi
 
Oben