주어진 시간에 한 번만 스크립트를 실행해야 합니다.
방정식: - 처음으로 스크립트가 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이 마지막 실행 날짜를 확인하고 자체 날짜를 쓰기 전에 시작됩니다.
전체 알고리즘은 다음과 같습니다.
- 세마포어를 설정합니다.
- 마지막 실행 시간을 읽습니다.
- 승인이 나면 자신만의 런타임을 작성하세요. (올바르게 작성한 후에는 나중에 가능합니다.)
- 이 스크립트와 관련된 작업을 수행하십시오.
- 세마포어를 해제합니다.
스크립트를 처음 실행할 때까지는 last_file
수동으로 스크립트를 넣지 않는 한 존재하지 않는다는 점을 기억해야 합니다. 따라서 거기에 넣거나 적절한 논리를 사용하여 스크립트를 이에 면역되게 만드십시오.
답변2
스크립트 끝에서 이를 사용하여 date +%s
현재 시간(1970년 1월 1일 이후 초 단위)을 가져와 외부 파일에 기록하고 기존 콘텐츠를 덮어쓸 수 있습니다.
스크립트 시작 부분에서 파일의 값을 읽고, 현재 시간을 얻고(다시 date +%s
), 다른 시간에서 하나를 빼고, 그 차이를 사용하여 무엇을 할지 결정할 수 있습니다.
(큰 그림입니다. 분명히 파일을 찾을 수 없음, 숫자가 아닌 값 읽기, 파일 권한, 경쟁 조건 등과 같은 문제를 처리해야 합니다. 그러나 이는 세부 사항입니다.)