So führen Sie einen nächtlichen Backup-Job auf Snow Leopard Server über launchd aus

Ich habe versucht, einen nächtlichen Backup-Job auf meinem Mac Mini-Server zu konfigurieren, und nach viel Googeln und Graben und Manpages fand ich heraus, dass das auch richtig zu sein schien, und versuchte, meine eigene Plist-Datei launchdeinzurichten . Ich habe mir das ausgedacht (gespeichert in /Library/LaunchDaemons/dk.revealit.NightlyRSyncBackup.plist):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>dk.revealit.NightlyRSyncBackup</string>
        <key>ProgramArguments</key>
        <array>
                <string>/var/root/run-rsync</string>
        </array>
        <key>LowPriorityIO</key>
        <true/>
        <key>Nice</key>
        <integer>1</integer>
        <key>WorkingDirectory</key>
        <string>/var/root</string>
        <key>RunAtLoad</key>
        <false/>
        <key>StartCalendarInterval</key>
        <dict>
                <key>Hour</key>
                <integer>3</integer>
                <key>Minute</key>
                <integer>15</integer>
        </dict>
</dict>
</plist>

Das Problem ist, es funktioniert nicht. Ich kann es mit laden launchctl, und es erscheint launchctl listmit dem Exit-Status 0. Aber wenn ich meine Backup-Dateien überprüfe, werden sie nicht aktualisiert.

Irgendwelche Hinweise darauf, was ich falsch mache (vorausgesetzt, mein Backup-Skript funktioniert so, wie es sollte)?

Was enthält /var/root/run-rsync?

Antworten (2)

Mir fallen mehrere Dinge ein:

  • Hast du über Nacht gewartet, bis es läuft? launchctl loadwird es nicht außerhalb der Reihenfolge laufen lassen -- wenn Sie es zu einer anderen Zeit als 3:15 Uhr laufen lassen möchten, verwenden Sie es, sudo launchctl start dk.revealit.NightlyRSyncBackupnachdem es geladen wurde.

  • Löst das run-rsync-Skript irgendwelche Hintergrundprozesse aus oder macht es alles inline? Denn wenn das Skript beendet wird und noch Hintergrundprozesse laufen, denkt launchd, dass etwas schief gelaufen ist und beendet die Hintergrundprozesse. Wenn Sie dies nicht möchten, fügen Sie <key>AbandonProcessGroup</key><true/>die .plist hinzu.

  • Hängt das Skript von PATH ab, einschließlich aller nicht standardmäßigen Verzeichnisse (z. B. /opt/local/bin oder so ähnlich)?

Eine nützliche Debugging-Technik besteht darin, Folgendes hinzuzufügen:

<key>StandardOutPath</key>
<string>/var/root/NightlyRSyncBackup.out</string>
<key>StandardErrorPath</key>
<string>/var/root/NightlyRSyncBackup.err</string>

in die .plist und sehen Sie, was in diesen Dateien angezeigt wird.

Wie sich herausstellte, war es ein Problem, dass der SSH-Schlüssel nicht richtig gelesen wurde, wenn er über launchd ausgeführt wurde. Ihr Tipp mit StandardOutPath und StandardErrorPath war von unschätzbarem Wert, um dieses Problem zu finden, danke :)

Nachdem Sie eine ähnliche Frage beantwortet haben , überprüfen Sie dies zuerst:

von demman lanuchctl

Beachten Sie, dass Konfigurationsdateien pro Benutzer (LaunchAgents) dem Benutzer gehören müssen, der sie lädt. Alle systemweiten Daemons (LaunchDaemons) müssen root gehören. Konfigurationsdateien dürfen nicht gruppen- oder weltweit beschreibbar sein. Diese Einschränkungen sind aus Sicherheitsgründen vorhanden, da die Beschreibbarkeit einer launchd-Konfigurationsdatei es einem ermöglicht, anzugeben, welche ausführbare Datei gestartet wird.

Also, wenn Ihr rsync als root gestartet werden soll

chown root  /Library/LaunchDaemons/your.plist 
chgrp wheel /Library/LaunchDaemons/your.plist 
chmod 644   /Library/LaunchDaemons/your.plist

und danach:

launchctl load /Library/LaunchDaemons/your.plist
Das war ein guter Tipp, aber die Eigentumsrechte/Berechtigungen waren schon okay :)
Zwei Wochen alte Frage - funktioniert immer noch nicht? das muss ein wirklich komisches problem sein...