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
와 함께 (프로그램이 지정된 시간이 아니라 시작시 바로 시작되었습니다 .) 추가 매개 변수를 설정하면 (문서화되지 않음)이 동작이 변경되고 지정된 달력 시간에 프로그램이 처음 시작됩니다. :SuccessfulExit
RunAtLoad
StartCalendarIntervall
AfterInitialDemand
<?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
.