Tengo una secuencia de comandos launchd similar a cron ( 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 casos raros, puede fallar cuando Internet no está disponible. La secuencia de comandos backup.sh luego establece un código de error adecuado que es mayor que 0.
Ahora me gustaría que el script se reinicie automáticamente una hora más tarde después de un error. Y una y otra vez hasta que no haya error. Pero no después de 24 horas para evitar que se ejecuten dos secuencias de comandos 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 script se ejecute todo el tiempo, pero solo una vez al día a través de StartCalendarInterval
.
¿Es posible realizar mi tarea directamente con launchd? ¿O debería simplemente agregar wait 1 hour and try again after error
a mi script? La secuencia de comandos requeriría recursos todo el tiempo cuando se configura de esta manera. Me gustaría evitar esto.