Ich habe eine Datei „backup.sh“, die einen rsync-Befehl startet. Dieser rsync dient zum Sichern meines dedizierten Servers auf einem RaspberryPi mit Raspbian.
(Ich verwende den Schlüsselbund, sodass ich kein Passwort usw. eingeben muss ...)
Das Problem besteht darin, dass alles funktioniert, wenn ich den Batch manuell starte. Wenn ich ihn jedoch über Crontab (mit demselben Benutzer) starte, erhalte ich den folgenden Fehler:
2013/10/07 19:36:02 [6456] rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
2013/10/07 19:36:02 [6456] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]
Hier ist meine Datei backup.sh
#!/bin/bash
echo "_ backup start "$(date +%H:%M:%S)
echo " "
/usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete --log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' --rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/
echo " "
echo "_ backup end "$(date +%H:%M:%S)
Und nun die Crontab-Zeile (crontab -e)
# m h dom mon dow command
30 5 * * * /home/user/backup.sh | mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]
Grüße
Antwort1
(Ich verwende den Schlüsselbund, sodass ich kein Passwort usw. eingeben muss ...)
Ok, Sie müssen also dem in Ihrem Cron-Job laufenden Programm mitteilen, wie es Ihren Schlüsselbund findet.
SSH sucht über die Umgebungsvariable nach einem SSH-Agenten (den der Schlüsselbund emuliert) SSH_AUTH_SOCK
. Daher müssen Sie diese Umgebungsvariable in Ihrer Crontab festlegen.
In einer typischen Konfiguration SSH_AUTH_SOCK
ist ein Pfad zu einem Socket mit einem zufälligen Namen. Da Sie keychain verwenden, können Sie leicht einen alternativen Namen für diesen Socket finden: keychain schreibt Dateien in , ~/.keychain
die Umgebungsvariablendeklarationen enthalten, die SSH_AUTH_SOCK
und andere ähnliche Variablen ( SSH_AGENT_PID
, GPG_AGENT_INFO
) festlegen. Fügen Sie also einfach die entsprechende Datei in Ihren Cron-Job ein.
[email protected]
30 5 * * * . ~/.keychain/$(hostname)-sh; /home/user/backup.sh
(Abgesehen davon: cron verfügt über eine integrierte Funktion zum Senden von E-Mails mit der Ausgabe des Jobs, sodass Sie nur dann eine E-Mail erhalten, wenn der Job eine Ausgabe erzeugt. Sie müssen nicht herumfummeln | mail
.)
Antwort2
Die SSH-Verbindung funktioniert vom Cronjob aus nicht. Wie soll die SSH-Authentifizierung durchgeführt werden? Es ist kein Versuch sichtbar, einen Identitätsschlüssel oder ein Passwort aufzulisten. Ich würde ein „-i“ mit dem Pfad zu Ihrem (passwortlosen...) Schlüssel einfügen, wenn es so funktioniert. Die Hauptunterschiede zwischen Befehlszeile und Cronjob liegen in der Regel in der Umgebung (beides Dinge wie Umgebungsvariablen, das Fehlen eines Steuerterminals usw.).
Antwort3
Ich glaube, Sie haben bei Ihrem Thema ein Zitierproblem:
mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]
Sollte dies sein:
mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]
Alternativer Ansatz
Ich würde die E-Mail auch in das Skript einbinden.
#!/bin/bash
(
echo "_ backup start "$(date +%H:%M:%S)
echo " "
/usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete \
--log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' \
--rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/
echo " "
echo "_ backup end "$(date +%H:%M:%S)
) | mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]
Ändern Sie dann den Crontab-Eintrag wie folgt:
30 5 * * * /home/user/backup.sh
Stellen Sie außerdem sicher, dass das Konto, auf dem dieser Cron ausgeführt wird, tatsächlich E-Mails senden kann. Führen Sie einen Test durch.