[apple] 스크립트 오류가 발생했을 때 cron과 같은 실행 스크립트를 다시 스팬하는 방법은 무엇입니까?

StartCalendarInterval웹 사이트 데이터를 하루에 한 번 백업 하는 크론과 같은 실행 스크립트 ( )가 있습니다.

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

드물게 인터넷을 사용할 수 없을 때 잘못 될 수 있습니다. 그런 다음 backup.sh 스크립트는 0보다 큰 적절한 오류 코드를 설정합니다.

이제 오류가 발생한 후 1 시간 후에 스크립트가 자동으로 다시 시작되고 싶습니다. 그리고 오류가 없을 때까지 반복해서. 그러나 24 시간 후에는 스크립트의 두 인스턴스가 동시에 실행되는 것을 피할 수 없습니다.

나는 이것이 가능해야한다 생각 ThrottleInterval하고 SuccessfulExit. 내 문제는 SuccessfulExit에 연결되어 있다는 것 입니다 KeepAlive. 스크립트가 항상 실행되는 것을 원하지 않지만을 통해 하루에 한 번만 실행하십시오 StartCalendarInterval.

내 작업이 시작된 상태에서 직접 수행 할 수 있습니까? 아니면 단순히 wait 1 hour and try again after error내 스크립트에 추가해야 합니까? 스크립트는 이와 같이 설정할 때 항상 리소스가 필요합니다. 나는 이것을 피하고 싶다.



답변

부분적으로 할 수있는 것 같습니다. 기본적으로 문제는 암시 KeepAlive와 함께 (프로그램이 지정된 시간이 아니라 시작시 바로 시작되었습니다 .) 추가 매개 변수를 설정하면 (문서화되지 않음)이 동작이 변경되고 지정된 달력 시간에 프로그램이 처음 시작됩니다. :SuccessfulExitRunAtLoadStartCalendarIntervallAfterInitialDemand

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

유일한 문제는 프로그램 / 스크립트가 실패하면을 ThrottleInterval재정의 StartCalendarInterval하므로 오류 시간과 설정된 간격에 따라 하루가 경과 한 후 지정된 달력 시간에 프로그램 / 스크립트가 정확하게 시작되지 않는다는 것입니다 ( ) 및 홀수 시간 오프셋에서 계속 될 수 있습니다 (성공할 때까지).

그러나 요약하자면, 비결은 문서화되지 않은 것 AfterInitialDemand입니다 true.


답변