다음에 특정 시간이 발생할 때까지 수면


11

다음에 "4:00"과 같은 특정 시간이 발생할 때까지 휴면 상태를 유지하는 일련의 명령 또는 단일 명령이 필요합니다.

어떻게해야합니까?

at명령 또는 cronjob에 내가 현재에있어 스크립트를 떠나 있어야하기 때문에 옵션이 아닙니다.

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

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

방금 끔찍한 아이디어가있었습니다.

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

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

더 좋은 아이디어가 있습니까?

요청하면 더 많은 정보가 추가됩니다!


질문을 좀 더 명확히 해주시겠습니까? "현재있는 스크립트를 그대로두면 안됩니다"
sebelk

스크립트에서 "wake up"파일이 있는지 확인하고 일정 시간 동안 다시 잠자기 전에 다시 확인하는 것은 어떻습니까? 그런 다음 cron을 사용하여 파일을 생성하고 cron의 안정성을 활용할 수 있지만 오래 지속되는 스크립트도 가질 수 있습니다. 절전 모드가 중지되면 스크립트가 "wake up"파일을 제거하도록하십시오.
kurtm

Mac에서 당신이 대체 해주십시오 date -ddate -j및 교체 4:00와 함께 0400.
pjvandehaar

답변:


17

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

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

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

주어진 시간과 현재 시간의 차이를 초 단위로 계산합니다. 숫자가 음수이면 하루 종일 (초당 86400 초) 초를 추가하여 잠자기 시간 (초)을 가져와야합니다.


시스템 시계가 앞뒤로 움직이면 어떻게됩니까 (예 : ntp).
WhyNotHugo

10

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

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

24 시간입니다. 오전 4시와 오후 4시에 계속 진행하려면 다음을 사용하십시오.

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

이것은 옵션 일 수 있습니다. 방금 아이디어가있었습니다. 몇 분 후에 돌아올 것입니다.
BrainStone

0

오픈 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기대하는 분 사양의 정확히 두 자리.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.