다음번 특정 시간까지 수면

다음번 특정 시간까지 수면

일련의 명령이나 "4:00"과 같은 특정 시간이 다음에 발생할 때까지 잠자기 상태인 단일 명령이 필요합니다.

어떻게 해야 합니까?

현재 사용 중인 스크립트를 종료하면 안 되기 때문에 명령 at이나 cronjob은 옵션이 아닙니다.

내가 말하는 구체적인 사례는 화면에서 실행되는 스크립트입니다. 스크립트의 어느 지점에서 필요한 중요한 변수들이 많이 저장되어 있기 때문에 스크립트 자체로 스크립트 실행을 멈추지 않는 것이 매우 중요합니다. 스크립트가 항상 일반적인 문제로 실행되는 것은 아닙니다. 특정 시간에 실행되기만 하면 됩니다.

스크립트가 파일이나 cronjob 또는 기타 화면과 같은 다른 작업을 생성해야 한다면 매우 유익할 것입니다. 이것은 단순히 디자인의 문제입니다.

방금 끔찍한 생각이 떠올랐어요.

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

더 좋은 아이디어가 있나요?

더 많은 정보는 요청하시면 추가하겠습니다!

답변1

terdon의 제안은 효과가 있지만 내 제안이 더 효율적이라고 생각합니다.

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

이것은 주어진 시간과 현재 시간의 차이를 초 단위로 계산합니다. 숫자가 음수이면 잠을 자야 하는 초를 얻기 위해 하루 전체에 대한 초(정확히 86400)를 추가해야 하며 숫자가 양수이면 그냥 사용할 수 있습니다.

답변2

쉘 스크립트라고 가정하면 다음과 같이 작동합니다.

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

24시간 동안입니다. 오전 4시와 오후 4시 모두에 이 작업을 계속하려면 다음을 대신 사용하세요.

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

답변3

~에오픈BSD, 다음을 사용하여 */55분 단위로 압축할 수 있습니다.crontab(5)작업을 시간 단위로 수행합니다 00(정확한 간격으로 동일한 작업을 수행하는 동안 더 적은 수의 이메일이 생성되도록 하기 위해):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

참고date(1)또한sleep(1)최종 반복에서 의도적으로 60분은 유효한 시간이 아니기 때문에(그렇지 않은 한!) 이메일 보고서를 받기 전에 추가 시간을 기다릴 필요가 없습니다.

또한 반복 중 하나에 할당된 시간이 5분 이상 걸릴 경우 sleep전혀 잠을 자지 않음으로써 의도적으로 실패하게 됩니다(음수는 명령줄 옵션으로 해석되기 때문입니다). 다음 시간 또는 영원히) 할당된 시간 내에 작업이 완료될 수 있는지 확인합니다(예: 반복 중 하나만 5분보다 조금 더 걸리는 경우, 우리는 여전히 따라잡을 시간이 있습니다. 다음 시간까지 마무리되는 모든 것).

그만큼printf(1)date분 지정에는 정확히 두 자리 숫자가 필요 하기 때문에 필요합니다 .

관련 정보