Cómo ejecutar un trabajo de respaldo nocturno en Snow Leopard Server a través de launchd

He estado tratando de configurar un trabajo de copia de seguridad nocturno en mi servidor Mac Mini, y después de mucho buscar en Google, excavar y buscar páginas de manual, descubrí que también parecía ser el correcto, y traté de configurar launchdmi propio archivo plist. . Se me ocurrió esto (almacenado en /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>

El problema es que no funciona. Puedo cargarlo con launchctl, y aparece launchctl listcon el estado de salida 0. Pero si reviso mis archivos de respaldo, no están actualizados.

¿Alguna pista sobre lo que estoy haciendo mal (suponiendo que mi script de copia de seguridad funcione como debería)?

¿Qué contiene /var/root/run-rsync?

Respuestas (2)

Varias cosas vienen a la mente:

  • ¿Esperaste toda la noche para que se ejecutara? launchctl loadno hará que se quede sin secuencia; si desea que se ejecute en algún momento que no sea a las 3:15 am, utilícelo sudo launchctl start dk.revealit.NightlyRSyncBackupdespués de que esté cargado.

  • ¿La secuencia de comandos run-rsync activa algún proceso en segundo plano o hace todo en línea? Porque si el script se cierra y todavía hay procesos en segundo plano, launchd cree que algo salió mal y elimina los procesos en segundo plano. Si no desea que haga esto, agregue <key>AbandonProcessGroup</key><true/>a .plist.

  • ¿El script depende de PATH, incluidos los directorios no estándar (por ejemplo, /opt/local/bin o algo así)?

Una técnica de depuración útil es agregar algo como:

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

a .plist y vea qué aparece en esos archivos.

Resultó que era un problema con la clave SSH que no se leía correctamente cuando se ejecutaba a través de launchd. Su sugerencia con StandardOutPath y StandardErrorPath fue invaluable para encontrar ese problema, gracias :)

Una vez que respondiste una qst similar , verifica esto primero:

desde elman lanuchctl

Tenga en cuenta que los archivos de configuración por usuario (LaunchAgents) deben ser propiedad del usuario que los carga. Todos los demonios de todo el sistema (LaunchDaemons) deben ser propiedad de root. Los archivos de configuración no deben ser de escritura grupal o mundial. Estas restricciones existen por razones de seguridad, ya que permitir la escritura en un archivo de configuración de lanzamiento permite especificar qué ejecutable se lanzará.

Entonces, si su rsync debe mirarse como root

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

y despues de estos:

launchctl load /Library/LaunchDaemons/your.plist
Ese fue un buen consejo, pero la propiedad/permisos ya estaban bien :)
Pregunta de hace dos semanas: ¿todavía no funciona? eso debe ser un problema realmente raro...