Tengo un launchd tipo cron script ( StartCalendarInterval
) que hace una copia de seguridad de algunos datos del sitio web una vez al día:
<?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>com.example.backup</string>
<key>ProgramArguments</key>
<array>
<string>/Volumes/Example/backup.sh</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>15</integer>
</dict>
</array>
<key>StandardErrorPath</key>
<string>/var/log/com.example/backup_error</string>
<key>StandardOutPath</key>
<string>/var/log/com.example/backup_output</string>
</dict>
</plist>
En raras ocasiones puede fallar cuando no se dispone de Internet. La copia de seguridad.sh script establece entonces un código de error adecuado que es mayor que 0.
Ahora me gustaría que el scriptse relance automáticamente una hora después de un error. Y una y otra vez hasta que no haya ningún error. Pero no después de 24 horas para evitar que se ejecuten dos instancias del script al mismo tiempo.
Creo que esto debe ser posible con ThrottleInterval
y SuccessfulExit
. Mi problema es que SuccessfulExit
está vinculado a KeepAlive
. No quiero que el scriptse ejecute todo el tiempo, sino sólo una vez al día a través del StartCalendarInterval
.
¿Es posible realizar mi tarea directamente con launchd? O debería simplemente añadir wait 1 hour and try again after error
a mi script? El script requeriría recursos todo el tiempo cuando se configura así. Me gustaría evitar esto.