1 votos

¿Cómo volver a expandir un launchd tipo cron script en caso de error de script?

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.

1voto

Bravo Puntos 83

Parece que se puede hacer parcialmente. Básicamente el problema era que KeepAlive en combinación con SuccessfulExit implicaba una RunAtLoad (el programa se lanzó justo al inicio y no al StartCalendarIntervall .) Ajuste del parámetro adicional AfterInitialDemand (que no está documentado) cambiará este comportamiento y el programa se lanzará por primera vez a la hora del calendario especificada:

<?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>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false/>
        <key>AfterInitialDemand</key>
        <true/>
    </dict>
    <key>ThrottleInterval</key>
    <integer>3600</integer>

    <key>StandardErrorPath</key>
    <string>/var/log/com.example/backup_error</string>
    <key>StandardOutPath</key>
    <string>/var/log/com.example/backup_output</string>
</dict>
</plist>

El único problema es que si el programa/ script falla entonces ThrottleInterval anulará el StartCalendarInterval , por lo que, dependiendo de la hora del error y del intervalo establecido, el programa/ script no se lanzaría exactamente a la hora del calendario especificada después de que haya transcurrido un día (suponiendo que haya fallado hasta entonces) y podría continuar con desfases de tiempo impares (hasta que tenga éxito).

Pero resumiendo: el truco está en lo indocumentado AfterInitialDemand ajustado a true .

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X