가변적인 가동 시간과 프로그램 오류 가능성을 고려하면서 프로그램을 하루에 한 번만 실행하려면 어떻게 해야 합니까?

가변적인 가동 시간과 프로그램 오류 가능성을 고려하면서 프로그램을 하루에 한 번만 실행하려면 어떻게 해야 합니까?

명령을 한 번 실행해야 하지만 성공할 때까지 하루에 한 번만 실행해야 합니다.

지속적인 가동 시간을 기대할 수 없으며 프로그램 성공도 보장할 수 없습니다.

이 프로그램에는 네트워크 액세스가 필요하지만 네트워크 액세스로 컴퓨터를 시작할 때마다 그렇지는 않습니다.

내 프로그램은 성공하지 않는 한 -1과 같이 종료됩니다(0을 반환함).

답변1

이를 제공하려면 쉘을 사용하십시오. 예를 들어, 다음과 같은 스크립트를 작성하십시오.

#!/bin/sh
# Check to see if this is already running from some other day
mkdir /tmp/lock || exit 1
while ! command-to-execute-until-succeed; do
    # Wait 30 seconds between successive runs of the command
    sleep 30
done
rmdir /tmp/lock

그런 다음 cron으로 스크립트를 지정하십시오.

답변2

내 생각에 가장 쉬운 방법은 프로그램이 시도하기 전에 파일의 존재를 확인하고 성공적으로 실행되면 해당 파일을 생성하는 것입니다.

그렇게 하도록 프로그램을 수정할 수 없는 경우 cronjob 자체를 사용하십시오. 다음과 같은 내용이 있습니다.

test -e /path/to/tempfile || ( /path/to/program && touch -a /path/to/tempfile )

유닉스가 조건 검사를 평가하는 방식 때문에 조건의 왼쪽이 로 ||평가되면 true전체 표현식이 true이고 오른쪽은 평가되지 않습니다. 즉, 프로그램이 호출되지 않습니다.

그런 다음 괄호 내에서 &&는 양쪽이 모두 true로 평가되어야 하므로 /path/to/program0이 아닌 반환 코드로 종료하는 경우 오른쪽의 명령문을 평가할 필요가 없습니다. 표현식은 이미 false로 평가되어 /path/to/tempfile생성되지 않습니다.

관련 정보