스크립트는 주어진 시간에 한 번만 실행됩니다.

스크립트는 주어진 시간에 한 번만 실행됩니다.

주어진 시간에 한 번만 스크립트를 실행해야 합니다.

방정식: - 처음으로 스크립트가 9시 30분에 실행되지만 누군가가 930과 945 사이에 내 스크립트를 다시 실행하려고 하면(예: 수동으로 또는 940의 작업을 통해) 실행되지 않아야 합니다.

if [ (${date} -gt "0930" && ${date} -lt "0945")  or (${date} -gt "1130" && ${date} -lt "1145")  ]  
then  
    write_log "Fetching data"  
    while read line   
    do  
        "does processing"  
    done < ${CONFIG_FILE}  
else  
    write_log "Its not time to fetch details."  
fi  

답변1

마지막 실행 날짜를 파일에 저장할 수 있습니다.

date +"%s" > last_file

last_file파일 이름은 다음과 같습니다. 예를 들어, 이는 에포크가 시작된 이후의 초 수를 기록합니다. 1549605438. 이것을 갖고 나면 읽을 수 있습니다:

read last < last_file

이는 last쉘 변수 이름입니다. 이것을 갖고 나면 비교할 산술이 필요합니다.

threshold=900 # 60 * 15 = 15 minutes
[ "$(date +'%s')" -gt "$((last + threshold))" ] || exit

현재 두 번째 카운트를 마지막 카운트에 설정된 일시 중지 간격을 더한 값과 비교합니다. 시간이 충분하지 않으면 종료하십시오. 그렇지 않으면 계속 - 나머지 스크립트를 실행합니다.

마지막으로 두 인스턴스가 동일한 방식으로 시작되는 것을 방지하려면 몇 가지 세마포어가 필요합니다. 프로세스 2는 프로세스 1이 마지막 실행 날짜를 확인하고 자체 날짜를 쓰기 전에 시작됩니다.

전체 알고리즘은 다음과 같습니다.

  1. 세마포어를 설정합니다.
  2. 마지막 실행 시간을 읽습니다.
  3. 승인이 나면 자신만의 런타임을 작성하세요. (올바르게 작성한 후에는 나중에 가능합니다.)
  4. 이 스크립트와 관련된 작업을 수행하십시오.
  5. 세마포어를 해제합니다.

스크립트를 처음 실행할 때까지는 last_file수동으로 스크립트를 넣지 않는 한 존재하지 않는다는 점을 기억해야 합니다. 따라서 거기에 넣거나 적절한 논리를 사용하여 스크립트를 이에 면역되게 만드십시오.

답변2

스크립트 끝에서 이를 사용하여 date +%s현재 시간(1970년 1월 1일 이후 초 단위)을 가져와 외부 파일에 기록하고 기존 콘텐츠를 덮어쓸 수 있습니다.

스크립트 시작 부분에서 파일의 값을 읽고, 현재 시간을 얻고(다시 date +%s), 다른 시간에서 하나를 빼고, 그 차이를 사용하여 무엇을 할지 결정할 수 있습니다.

(큰 그림입니다. 분명히 파일을 찾을 수 없음, 숫자가 아닌 값 읽기, 파일 권한, 경쟁 조건 등과 같은 문제를 처리해야 합니다. 그러나 이는 세부 사항입니다.)

관련 정보