1 votes

Comment rétablir un cron-like launchd script en cas d'erreur script ?

J'ai un cron-like launchd script ( StartCalendarInterval ) qui fait une sauvegarde de certaines données du site web une fois par jour :

<?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>

Dans de rares cas, il peut se produire un problème lorsque l'Internet n'est pas disponible. Le backup.sh script définit alors un code d'erreur approprié qui est plus grand que 0.

Maintenant je voudrais que le script soit automatiquement relancé une heure plus tard après une erreur. Et encore et encore jusqu'à ce qu'il n'y ait plus d'erreur. Mais pas après 24 heures pour éviter que deux instances du script s'exécutent en même temps.

Je pense que cela doit être possible avec ThrottleInterval y SuccessfulExit . Mon problème est que SuccessfulExit est lié à KeepAlive . Je ne veux pas que le script s'exécute tout le temps, mais juste une fois par jour via la fonction StartCalendarInterval .

Ma tâche est-elle réalisable directement avec launchd ? Ou dois-je simplement ajouter wait 1 hour and try again after error à mon script ? Le script aurait besoin de ressources en permanence lorsqu'il est configuré de cette manière. Je voudrais éviter cela.

1voto

Thillakan Points 1344

Il semble que cela puisse être fait partiellement. En fait, le problème était le suivant KeepAlive en combinaison avec SuccessfulExit implicite a RunAtLoad (le programme a été lancé dès le début et non à l'heure spécifiée). StartCalendarIntervall .) Réglage du paramètre supplémentaire AfterInitialDemand (qui n'est pas documenté) change ce comportement et le programme est lancé pour la première fois à l'heure du calendrier spécifié :

<?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>

Le seul problème est que si le programme/ script échoue alors ThrottleInterval annulera le StartCalendarInterval Ainsi, en fonction de l'heure de l'erreur et de l'intervalle défini, le programme/ script ne se lancerait pas exactement à l'heure calendaire spécifiée après qu'un jour se soit écoulé (en supposant qu'il ait échoué jusque-là) et pourrait continuer à des décalages horaires impairs (jusqu'à ce qu'il réussisse).

Mais pour résumer : l'astuce est le sans-papiers AfterInitialDemand réglé sur true .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X