특정 시간/날짜까지 sleep
bash 스크립트를 특정 시간까지 sleep 상태로 해 주세요.그래서 나는 "sleep"과 같은 명령어를 원하는 것은 휴식 시간이 아니라 종료 시간이고 그때까지 자는 것이다.
실행 중인 스크립트를 특정 날짜/시간까지 차단해야 하므로 "at" 대몬은 해결책이 아닙니다.
그런 명령어가 있나요?
무법자 프로그래머가 말한 것처럼 올바른 초수를 자는 것이 해결책이라고 생각합니다.
이를 bash로 수행하려면 다음 작업을 수행합니다.
current_epoch=$(date +%s)
target_epoch=$(date -d '01/01/2010 12:00' +%s)
sleep_seconds=$(( $target_epoch - $current_epoch ))
sleep $sleep_seconds
정밀도를 나노초(실효적으로 약 밀리초)로 낮추려면 다음 구문을 사용합니다.
current_epoch=$(date +%s.%N)
target_epoch=$(date -d "20:25:00.12345" +%s.%N)
sleep_seconds=$(echo "$target_epoch - $current_epoch"|bc)
sleep $sleep_seconds
MacOS/ OS X가 정밀도를 지원하지 않는 경우 MacOS/OS X 지 하 에 만 밀 원 않 문 기 note 도 , os 의 seconds that지 belowcoreutils부에서brew대신 → 다음 지침을 참조하십시오.
샘플 편집:집, 2020년 4월 22일, 10시30, 10시 5520 μ20 μm 내지 30μm이다.
(예: 독 samples)판중 () for요에 reading(플)
일반적인 방법(쓸데없는 포크는 피하세요!)
4년 전에 이 질문을 받았기 때문에 첫 번째 파트는 오래된 bash 버전에 관한 것입니다.
(a: 이 방법은)date -fPOSIX도 아니고 MacOS에서도 동작하지 않습니다!Mac에서는 순수 bash 기능을 사용할 수 있습니다.)
★★★★★★★을forks이 아닌date 저는 이런걸 게 더 좋아요.
단순 시작 샘플
sleep $(( $(date -f - +%s- <<< "tomorrow 21:30"$'\nnow') 0 ))
서 ''는tomorrow 21:30에 의해 인식되는 어떤 종류의 날짜나 형식으로 대체될 수 있다date에는 . . . . .
if read -rp "Sleep until: " targetTime ;then
sleep $(( $(date -f - +%s- <<< "$targetTime"$'\nnow') 0 ))
fi
고정밀 (나노섹)
거의 동일:
sleep $(bc <<<s$(date -f - +'t=%s.%N;' <<<$'07:00 tomorrow\nnow')'st-t')
다음 시간에 도달하다
가능하면 오늘 다음 의미에 도달하기 위해, 너무 늦으면 내일:
sleep $((($(date -f - +%s- <<<21:30$' tomorrow\nnow')0)%86400))
이는 bash, ksh 및 기타 최신 셸에서 작동하지만 다음을 사용해야 합니다.
sleep $(( ( $(printf 'tomorrow %s\nnow\n' 21:30 | date -f - +%s-)0 )%86400 ))
우편함, 재, 대시 등 가벼운 조개껍데기 아래(파이프/파이프 1개 추가)
순수한 배쉬 방식, 포크는 없어!!
MacOS에서 테스트 완료!
두 가지 작은 함수를 작성했습니다.sleepUntil ★★★★★★★★★★★★★★★★★」sleepUntilHires
Syntax:
sleepUntil [-q] <HH[:MM[:SS]]> [more days]
-q Quiet: don't print sleep computed argument
HH Hours (minimal required argument)
MM Minutes (00 if not set)
SS Seconds (00 if not set)
more days multiplied by 86400 (0 by default)
는 "Bash"를 합니다.printfHH까지 sleeve 하는 이 새로운 방법에 대한 날짜 검색 옵션:MM Whithout 사용date아니면 다른 포크를 만들던지, 작은 배쉬 기능을 만들었죠.여기 있습니다.
sleepUntil() { # args: [-q] <HH[:MM[:SS]]> [more days]
local slp tzoff now quiet=false
[ "$1" = "-q" ] && shift && quiet=true
local -a hms=(${1//:/ })
printf -v now '%(%s)T' -1
printf -v tzoff '%(%z)T' $now
tzoff=$((0${tzoff:0:1}(3600*10#${tzoff:1:2}+60*10#${tzoff: -2})))
slp=$(((( 86400 + ( now - now%86400 ) +
10#$hms*3600+10#${hms[1]:-0}*60+10#${hms[2]:-0} -
tzoff - now
) % 86400 ) + 10#${2:-0} * 86400
))
$quiet || printf 'sleep %ss, -> %(%c)T\n' $slp $((now+slp))
read -t $slp _
}
그 후, 다음과 같이 입력합니다.
sleepUntil 10:37 ; date +"Now, it is: %T"
sleep 49s, -> Wed Apr 22 10:37:00 2020
Now, it is: 10:37:00
sleepUntil -q 10:37:44 ; date +"Now, it is: %T"
Now, it is: 10:37:44
sleepUntil 10:50 1 ; date +"Now, it is: %T"
sleep 86675s, -> Thu Apr 23 10:50:00 2020
^C
대상이 이전이면 내일까지 sleep 상태가 됩니다.
sleepUntil 10:30 ; date +"Now, it is: %T"
sleep 85417s, -> Thu Apr 23 10:30:00 2020
^C
sleepUntil 10:30 1 ; date +"Now, it is: %T"
sleep 171825s, -> Fri Apr 24 10:30:00 2020
^C
GNU/Linux에서 bash를 사용한 HiRes 시간
버전 5.0부터 최근 bash에서 새로 추가$EPOCHREALTIME변수(마이크로초)를 지정합니다..sleepUntilHires★★★★★★ 。
sleepUntilHires() { # args: [-q] <HH[:MM[:SS[.xxx]]]> [more days]
local slp tzoff now quiet=false musec musleep tmu
[ "$1" = "-q" ] && shift && quiet=true
local -a hms
IFS=: read -a hms <<<${1}
printf -v tmu %.06f ${hms[2]:-0}
printf -v hms[2] %.0f ${tmu%.*}
tmu=${tmu#*.}
printf -v now '%(%s)T' -1
IFS=. read now musec <<<$EPOCHREALTIME
musleep=$((2000000+10#$tmu-10#$musec))
printf -v tzoff '%(%z)T\n' $now
tzoff=$((0${tzoff:0:1}(3600*10#${tzoff:1:2}+60*10#${tzoff:3:2})))
slp=$(((( 86400 + ( now - now%86400 ) +
10#$hms*3600+10#0${hms[1]:-0}*60+10#${hms[2]:-0} -
tzoff - now - 1
) % 86400 ) + 10#${2:-0} * 86400
)).${musleep:1}
$quiet ||
printf 'sleep %ss, -> %(%c)T.%s\n' $slp $((now+${slp%.*}+1)) $tmu
read -t $slp _
}
: 이 은 ★★★★★★★★★★★★★★★★★★★★★★★★★」read -t는 wich가 wich가 있습니다.sleep유감스럽게도 실제 TTY가 없으면 백그라운드에서 실행할 수 없습니다.★★★★★★★★★★★★★★★★를 교환해 주세요.read -t타타에 sleep는 ( )를 사용하는 것을 검토해 .cron "/"/"at 것 )를 사용합니다.
은 건너뛰고 시험이나 하세요.$ËPOCHSECONDS!
「 」를 사용한 /proc/timer_list최신 커널에 의해 일반 사용자에게 회피되었습니다.
커널 에 Linux라는 ./proc/timer_list서 읽으실 수 .offset a. a. a.now변수(나노초 단위)입니다.따라서 수면 시간을 계산하여 원하는 최고 시간에 도달할 수 있습니다.
mapfile </proc/timer_list _timer_list
for ((_i=0;_i<${#_timer_list[@]};_i++));do
[[ ${_timer_list[_i]} =~ ^now ]] && TIMER_LIST_SKIP=$_i
[[ ${_timer_list[_i]} =~ offset:.*[1-9] ]] && \
TIMER_LIST_OFFSET=${_timer_list[_i]//[a-z.: ]} && \
break
done
unset _i _timer_list
readonly TIMER_LIST_OFFSET TIMER_LIST_SKIP
sleepUntilHires() {
local slp tzoff now quiet=false nsnow nsslp
[ "$1" = "-q" ] && shift && quiet=true
local hms=(${1//:/ })
mapfile -n 1 -s $TIMER_LIST_SKIP nsnow </proc/timer_list
printf -v now '%(%s)T' -1
printf -v tzoff '%(%z)T\n' $now
nsnow=$((${nsnow//[a-z ]}+TIMER_LIST_OFFSET))
nsslp=$((2000000000-10#${nsnow:${#nsnow}-9}))
tzoff=$((0${tzoff:0:1}(3600*${tzoff:1:2}+60*${tzoff:3:2})))
slp=$(( ( 86400 + ( now - now%86400 ) +
10#$hms*3600+10#${hms[1]}*60+${hms[2]} -
tzoff - now - 1
) % 86400)).${nsslp:1}
$quiet || printf 'sleep %ss, -> %(%c)T\n' $slp $((now+${slp%.*}+1))
sleep $slp
}
2개의 읽기 전용 변수를 정의한 후TIMER_LIST_OFFSET ★★★★★★★★★★★★★★★★★」TIMER_LIST_SKIP는 변수 에 매우 /proc/timer_list시간 : sleep (슬립 시간):
테스트 기능이 거의 없음
tstSleepUntilHires () {
local now next last
printf -v next "%(%H:%M:%S)T" $((${EPOCHREALTIME%.*}+1))
sleepUntilHires $next
date -f - +%F-%T.%N < <(echo now;sleep .92;echo now)
printf -v next "%(%H:%M:%S)T" $((${EPOCHREALTIME%.*}+1))
sleepUntilHires $next
date +%F-%T.%N
}
다음과 같이 렌더링할 수 있습니다.
sleep 0.244040s, -> Wed Apr 22 10:34:39 2020.000000
2020-04-22-10:34:39.001685312
2020-04-22-10:34:39.922291769
sleep 0.077012s, -> Wed Apr 22 10:34:40 2020.000000
2020-04-22-10:34:40.004264869
- 다음 초가 되면
- 인쇄 시간, 그러면
- 0.92 second를 기다립니다.
- 인쇄 시간, 그러면
- 남은 0.07초 동안 다음 초까지 계산
- sleep 0.07초 후
- 인쇄 시간
2023년 1월:GregD의 코멘트와 동면에 관한 새로운 장
컴퓨터가 완전 절전 모드로 전환되기 전에 시작하면 너무 긴 수면을 취할 수 있다고 GregD가 경고했습니다.
썼습니다.sleepUntilHires 물론 컴퓨터를 깨우는 것이 아니라 깨우면 바로 종료되어 시차가 나타납니다.
sleepUntilHires() { # args: [-q] <HH[:MM[:SS[.xxx]]]> [more days]
local slp tzoff now quiet=false musec musleep tmu start=${EPOCHREALTIME} tgt
[[ $_dummySleepFd ]] && [[ -e /dev/fd/$_dummySleepFd ]] ||
exec {_dummySleepFd}<> <(:)
[ "$1" = "-q" ] && shift && quiet=true
local -a hms; IFS=: read -a hms <<<${1}
printf -v tmu %.06f ${hms[2]:-0}
printf -v hms[2] %.0f ${tmu%.*}
tmu=${tmu#*.}; printf -v now '%(%s)T' -1
IFS=. read now musec <<<$start
musleep=$((2000000+10#$tmu-10#$musec))
printf -v tzoff '%(%z)T\n' $now
tzoff=$((0${tzoff:0:1}(3600*10#${tzoff:1:2}+60*10#${tzoff:3:2})))
slp=$(((( 86400 + ( now - now%86400 ) +
10#$hms*3600+10#0${hms[1]:-0}*60+10#${hms[2]:-0} -
tzoff - now - 1
) % 86400 ) + 10#${2:-0} * 86400
)).${musleep:1}
tgt=$((${start/.}+10#${slp/.}))
printf -v tmu '%(%c)T.%s' $(((${start/.}+10#${slp/.})/1000000)) $tmu
while ((slp=tgt-${EPOCHREALTIME/.},slp>0)) ;do
slp=00000$slp
printf -v slp %.6f ${slp::-6}.${slp: -6}
$quiet || printf '\rsleep %ss, -> %s ...' "$slp" "$tmu"
if (( 10#${slp/.} > 20000));then
read -u $_dummySleepFd -t .02 _
else read -u $_dummySleepFd -t $slp _
fi
done
if ! $quiet;then now=00000$((${EPOCHREALTIME/.}-tgt))
printf '\nScript done %.6f seconds late.\n' ${now::-6}.${now: -6}
fi
}
그럼 이제 노트북을 켜야겠네요.
sleepUntilHires 15:13:18.1234
sleep 0.002148s, -> lun 16 jan 2023 15:13:18 CET.123400 ...
Script done 0.000746 seconds late.
그건 정상적인 실행이었어요.이제 노트북을 최대 절전 모드로 전환합니다.
sleepUntilHires 15:15:18.1234
sleep 86.256328s, -> lun 16 jan 2023 15:15:18 CET.123400 ...
Script done 111.469551 seconds late.
그리고 잠에서 깨면 바로 자고 마지막 틈새를 보여 줍니다.
섞이지 $EPOCHSECOND ★★★★★★★★★★★★★★★★★」$EPOCHREALTIME!
와의 차이에 대한 경고를 읽습니다.
는 " " " 를 사용합니다.$EPOCHREALTIME 쓰지 $EPOCHSECOND다음 세컨드를 확립하기 위해:
문제 예:다음에 인쇄 시간을 2초 반올림하려고 합니다.
for i in 1 2;do
printf -v nextEvenSecond "%(%T)T" $(((EPOCHSECONDS/2)*2+2))
echo $nextEvenSecond
sleepUntilHires $nextEvenSecond
IFS=. read now musec <<<$EPOCHREALTIME
printf "%(%c)T.%s\n" $now $musec
done
생산 가능:
11:44:32
sleep 1.485212s, -> Wed Nov 9 11:44:32 2022.000000
Wed Nov 9 11:44:32 2022.000311
11:44:32
sleep 86399.999143s, -> Thu Nov 10 11:44:32 2022.000000
2초가 아니라 1일을 기다려야 해!!!
쓰셔야 돼요.$EPOCHREALTIME:
printf -v nextEvenSecond "%(%T)T" $(((${EPOCHREALTIME%.*}/2)*2+2))
11:48:12
sleep 0.300672s, -> Wed Nov 9 11:48:12 2022.000000
Wed Nov 9 11:48:12 2022.000345
11:48:14
sleep 1.998397s, -> Wed Nov 9 11:48:14 2022.000000
Wed Nov 9 11:48:14 2022.000536
11:48:16
sleep 1.998916s, -> Wed Nov 9 11:48:16 2022.000000
Wed Nov 9 11:48:16 2022.000325
해서에 sleep "/"/"read -t
기능에서는 이 in를 사용합니다.read -t(대신sleep 두 즉, 2가지 이유, 즉,
- 사용자가 키를 눌러 sleep을 방해할 수 있습니다.
(변수:IFS= read -sn 1 -t $slp _사용자가 키를 눌러 인터럽트를 할 수 있도록 합니다). sleep에의 호출을 암시하다./bin/sleep부티닌이 아니니까.
이 조작을 인터랙티브하게 실행하는 키보드 조작에 의한 유저의 인터랙션을 회피하려면 , 다음의 조작을 실시합니다.
- 리다이렉트하기 위한 의사 tty(파일 기술자) 작성
read에 의 입력sleepUntil.source★★★★★★★★★★★★★★★★★★:
exec {_dummySleepFd}<> <(:)
그 후 치환
read -t $slp _
타고
read -u $_dummySleepFd -t $slp _
- ★★
sleepbash 실장에서는 이것이 허가되어 있는 경우 로딩 가능한 빌트인( 참조)sudo apt install bash-builtins
enable -f sleep sleep
$BASH_LOADABLES_PATH있습니다 이외의 경우는, 「」 「」 「」, 「」
enable -f /usr/lib/bash/sleep sleep
언로드/비활성화:
enable -d sleep
몇 가지 테스트(내 산딸기):
exec {_dummySleepFd}<> <(:)
s=${EPOCHREALTIME/.};read -u $_dummySleepFd -t .01;echo $((${EPOCHREALTIME/.}-s))
10975
s=${EPOCHREALTIME/.};read -u $_dummySleepFd -t .01;echo $((${EPOCHREALTIME/.}-s))
10977
★★★★★★★★★★★★★★★★ /bin/sleep:
s=${EPOCHREALTIME/.};sleep .01;echo $((${EPOCHREALTIME/.}-s))
60676
s=${EPOCHREALTIME/.};sleep .01;echo $((${EPOCHREALTIME/.}-s))
47910
s=${EPOCHREALTIME/.};sleep .01;echo $((${EPOCHREALTIME/.}-s))
44585
은 ★★★★★★★★★★★★★★./bin/sleep파일 시스템에서 로드되었습니다.이게 더 길어요.하지만 어쨌든 캐시에 저장돼 있어서sleep★★★★★★★★★★★★★★★★★?
enable -f /usr/lib/bash/sleep sleep
s=${EPOCHREALTIME/.};sleep .01;echo $((${EPOCHREALTIME/.}-s))
10803
s=${EPOCHREALTIME/.};sleep .01;echo $((${EPOCHREALTIME/.}-s))
10760
쓰는 보다 조금 보이세요.read -u $_dummySleepFd -t ...
sleep, 시간을 하려면 , 「 」, 「 」를 사용합니다date 하면 '어느 정도 쓸 수 있다'를 사용할 수 거예요date -d 다음 싶다고 .예를 들어, 다음 주까지 기다리고 싶다고 합시다.
expr `date -d "next week" +%s` - `date -d "now" +%s`
기다리는 날짜로 "next week"를 대체한 다음 이 식을 값에 할당하고 몇 초 동안 절전 모드로 전환하십시오.
startTime=$(date +%s)
endTime=$(date -d "next week" +%s)
timeToWait=$(($endTime- $startTime))
sleep $timeToWait
다 끝냈어!
다음은 간단한 Bash 원라이너입니다.
sleep $(expr $(date -d "03/21/2014 12:30" +%s) - $(date +%s))
다음은 작업을 수행하고 남은 시간을 사용자에게 알려주는 솔루션입니다.밤 때 사이귄을 사용할 수 ).cron에 손을
특징들
- 세컨드까지 정확하게
- 시스템 시간 변경 감지 및 적응
- 남은 시간을 알려주는 인텔리전트 출력
- 24시간 입력 형식
- 하여 true를 하고 true를 반환한다.
&&
샘플 실행
$ til 13:00 && date
1 hour and 18 minutes and 26 seconds left...
1 hour and 18 minutes left...
1 hour and 17 minutes left...
1 hour and 16 minutes left...
1 hour and 15 minutes left...
1 hour and 14 minutes left...
1 hour and 10 minutes left...
1 hour and 5 minutes left...
1 hour and 0 minutes left...
55 minutes left...
50 minutes left...
45 minutes left...
40 minutes left...
35 minutes left...
30 minutes left...
25 minutes left...
20 minutes left...
15 minutes left...
10 minutes left...
5 minutes left...
4 minutes left...
3 minutes left...
2 minutes left...
1 minute left...
Mon, May 18, 2015 1:00:00 PM
( (「」 「」 「」 「」)에 의해, 「」에 것입니다.&& date)
코드
til(){
local hour mins target now left initial sleft correction m sec h hm hs ms ss showSeconds toSleep
showSeconds=true
[[ $1 =~ ([0-9][0-9]):([0-9][0-9]) ]] || { echo >&2 "USAGE: til HH:MM"; return 1; }
hour=${BASH_REMATCH[1]} mins=${BASH_REMATCH[2]}
target=$(date +%s -d "$hour:$mins") || return 1
now=$(date +%s)
(( target > now )) || target=$(date +%s -d "tomorrow $hour:$mins")
left=$((target - now))
initial=$left
while (( left > 0 )); do
if (( initial - left < 300 )) || (( left < 300 )) || [[ ${left: -2} == 00 ]]; then
# We enter this condition:
# - once every 5 minutes
# - every minute for 5 minutes after the start
# - every minute for 5 minutes before the end
# Here, we will print how much time is left, and re-synchronize the clock
hs= ms= ss=
m=$((left/60)) sec=$((left%60)) # minutes and seconds left
h=$((m/60)) hm=$((m%60)) # hours and minutes left
# Re-synchronise
now=$(date +%s) sleft=$((target - now)) # recalculate time left, multiple 60s sleeps and date calls have some overhead.
correction=$((sleft-left))
if (( ${correction#-} > 59 )); then
echo "System time change detected..."
(( sleft <= 0 )) && return # terminating as the desired time passed already
til "$1" && return # resuming the timer anew with the new time
fi
# plural calculations
(( sec > 1 )) && ss=s
(( hm != 1 )) && ms=s
(( h > 1 )) && hs=s
(( h > 0 )) && printf %s "$h hour$hs and "
(( h > 0 || hm > 0 )) && printf '%2d %s' "$hm" "minute$ms"
if [[ $showSeconds ]]; then
showSeconds=
(( h > 0 || hm > 0 )) && (( sec > 0 )) && printf %s " and "
(( sec > 0 )) && printf %s "$sec second$ss"
echo " left..."
(( sec > 0 )) && sleep "$sec" && left=$((left-sec)) && continue
else
echo " left..."
fi
fi
left=$((left-60))
sleep "$((60+correction))"
correction=0
done
}
SIGSTOP 신호를 전송하여 프로세스의 실행을 중지하고 SIGCONT 신호를 전송하여 프로세스의 실행을 재개할 수 있습니다.
따라서 SIGSTOP을 전송하여 스크립트를 중지할 수 있습니다.
kill -SIGSTOP <pid>
그런 다음 at deamon을 사용하여 동일한 방법으로 SIGCONT를 전송하여 웨이크업합니다.
아마도 당신의 스크립트는 잠들기 전에 언제 깨우고 싶은지 알려 줄 것입니다.
매일 같은 파라미터로 스크립트를 실행할 수 있도록 시간과 분만을 체크하는 스크립트를 원했습니다.내일이 언제가 될지 걱정 안 해도 돼요.그래서 저는 다른 방법을 사용했습니다.
target="$1.$2"
cur=$(date '+%H.%M')
while test $target != $cur; do
sleep 59
cur=$(date '+%H.%M')
done
스크립트의 파라미터는 시간과 분이기 때문에 다음과 같이 쓸 수 있습니다.
til 7 45 && mplayer song.ogg
(til은 스크립트 이름)
더 이상 직장에 지각하지 마세요. 당신이 하루를 잘못 입력했으니까요.건배!
SpoonMeiser의 답변에 따라 구체적인 예를 제시하겠습니다.
$cat ./reviveself
#!/bin/bash
# save my process ID
rspid=$$
# schedule my own resuscitation
# /bin/sh seems to dislike the SIGCONT form, so I use CONT
# at can accept specific dates and times as well as relative ones
# you can even do something like "at thursday" which would occur on a
# multiple of 24 hours rather than the beginning of the day
echo "kill -CONT $rspid"|at now + 2 minutes
# knock myself unconscious
# bash is happy with symbolic signals
kill -SIGSTOP $rspid
# do something to prove I'm alive
date>>reviveself.out
$
time ToWait = $($end - $start )
"timeToWait"는 음수일 수 있습니다! (예를 들어 "15:57"까지 sleep을 지정한 경우 "15:58"이 됩니다.)따라서 이상한 메시지 오류를 피하기 위해 체크해야 합니다.
#!/bin/bash
set -o nounset
### // Sleep until some date/time.
# // Example: sleepuntil 15:57; kdialog --msgbox "Backup needs to be done."
error() {
echo "$@" >&2
exit 1;
}
NAME_PROGRAM=$(basename "$0")
if [[ $# != 1 ]]; then
error "ERROR: program \"$NAME_PROGRAM\" needs 1 parameter and it has received: $#."
fi
current=$(date +%s.%N)
target=$(date -d "$1" +%s.%N)
seconds=$(echo "scale=9; $target - $current" | bc)
signchar=${seconds:0:1}
if [ "$signchar" = "-" ]; then
error "You need to specify in a different way the moment in which this program has to finish, probably indicating the day and the hour like in this example: $NAME_PROGRAM \"2009/12/30 10:57\"."
fi
sleep "$seconds"
# // End of file
저는 실제로 이 목적을 위해 https://tamentis.com/projects/sleepuntil/을 작성했습니다.대부분의 코드는 BSD 'at'에서 발생하므로 표준 규격에 준거하고 있습니다.
$ sleepuntil noon && sendmail something
지금부터 웨이크업 시간 사이의 초수를 계산하여 기존의 'sleep' 명령을 사용할 수 있습니다.
아마도 'at'를 사용하여 신호를 대기 중인 스크립트에 신호를 보낼 수 있습니다.
다음은 여러 테스트 클라이언트를 동기화하기 위해 작성한 것입니다.
#!/usr/bin/python
import time
import sys
now = time.time()
mod = float(sys.argv[1])
until = now - now % mod + mod
print "sleeping until", until
while True:
delta = until - time.time()
if delta <= 0:
print "done sleeping ", time.time()
break
time.sleep(delta / 2)
이 스크립트는 다음 라운드 시간 또는 샤프 시간까지 sleep합니다.
로는 '실행하다'를 들 수 ../sleep.py 10; ./test_client1.py의 ./sleep.py 10; ./test_client2.py뭇매를 치다
function sleepuntil() {
local target_time="$1"
today=$(date +"%m/%d/%Y")
current_epoch=$(date +%s)
target_epoch=$(date -d "$today $target_time" +%s)
sleep_seconds=$(( $target_epoch - $current_epoch ))
sleep $sleep_seconds
}
target_time="11:59"; sleepuntil $target_time
이걸 하기 위해 히프노스라는 작은 유틸리티를 만들었어요이때까지 crontab 구문과 블록을 사용하여 설정됩니다.
#!/bin/bash
while [ 1 ]; do
hypnos "0 * * * *"
echo "running some tasks..."
# ...
done
주요 답변을 확장하기 위해 날짜 문자열 조작에 관한 몇 가지 유효한 예를 다음에 제시하겠습니다.
sleep $(($(date -f - +%s- <<< $'+3 seconds\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'3 seconds\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'3 second\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'+2 minute\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'tomorrow\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'tomorrow 21:30\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'3 weeks\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'3 week\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'next Friday 09:00\nnow')0)) && ls
sleep $(($(date -f - +%s- <<< $'2027-01-01 00:00:01 UTC +5 hours\nnow')0)) && ls
또한 다음과 같은 간결한 Bash 원라이너도 고려하십시오.
sleep $((`date -d "22:00" +%s`-`date +%s`))
이것은 Bash v4.4.20 (1)의 산술식으로, 2개의 날짜 명령어 치환으로 구성됩니다.첫 번째 date 명령어는 초 단위(1970년 이후)까지, 후자는 각각의 현재 시간까지 타깃을 출력합니다.이 두 숫자는 산술적으로 마이너스 기호로 구분된다.그 결과 sleep 명령어 파라미터로 seconds가 취득됩니다.
Rust CLI 툴의 하품에는 도움이 되는 기능이 있습니다.Rust 가 인스톨 되어 있는 경우는, 간단하게 선택할 수 있습니다(cargo install yawn렇렇 、 Github 、 Apple 、 Linux 、 습니니니니니 。
이 스크립트는 7월 4일 21:44:59까지 대기합니다.
while (( $(date +"%Y%m%d%H%M%S") < 20220704214459 )); do :; done
echo "It is time!"
이제 표준적인 .pv이치노
- 의 「」를 합니다.
date「」가 아닌, 호환성이 .5 min. pv파라미터를 지정하여 원하는 출력을 얻을 수 있습니다.
SECS=$(( $(date -d '5 min' +%s)-$(date +%s) )) && pv -L1 -s$SECS -petlI <(seq $SECS) >/dev/null
OpenBSD 에서는, 다음의 정보를 사용해, 다음의 정보를 압축할 수 있습니다.*/55분간의 작업으로001시간에 1개(정확한 간격으로 동일한 작업을 수행하면서 생성되는 전자 메일 수를 줄이기 위해):
#!/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
는 마지막 반복 시 by 설계도 중단됨을 유의하십시오.60분(분)은 유효한 시간이 아니기 때문에 이메일 보고서를 받기 전에 추가 시간을 기다릴 필요가 없습니다.
는, 「」, 「1」, 「5」의 쪽인가에 해 주세요.sleep마찬가지로 (커맨드라인 옵션으로서 음수로 해석되는 수치로 인해) 전혀 수면을 취하지 않는 설계로 인해 (다음 1시간 또는 영원으로 감기는 것이 아니라) 작업이 할당된 시간 내에 완료될 수 있도록 합니다(예를 들어, 1회만 반복해도 5분 이상 걸리는 경우).앞으로 1시간 동안 아무것도 마무리하지 않고 계속 따라잡을 수 있는 시간이 있습니다.)
이 필요한 이유는date는, 분 지정에 대해서, 정확히 2 자리수를 상정하고 있습니다.
타리를 사용하다.제가 특별히 이걸 하기 위해 쓴 도구입니다.
https://github.com/metaphyze/tarry/
이것은 특정 시간까지 대기하기 위한 간단한 명령줄 도구입니다.이것은 일정 시간 동안 기다리는 "sleep"과 같지 않습니다.이 기능은 특정 시간에 무언가를 실행하려는 경우 또는 서버가 여러 개의 매우 동시 요청을 처리할 수 있는지 테스트하는 등 여러 작업을 정확히 동시에 실행하는 경우에 유용합니다.Linux, Mac 또는 Windows에서 &과 같이 사용할 수 있습니다.
tarry -until=16:03:04 && someOtherCommand
이 작업은 오후 4시 3분 04분까지 기다렸다가 다른 명령을 실행합니다.다음은 동시에 시작하도록 예약된 여러 요청을 실행하는 방법의 Linux/Mac 예입니다.
for request in 1 2 3 4 5 6 7 8 9 10
do
tarry -until=16:03:04 && date > results.$request &
done
Ubuntu, Linux 및 Windows 바이너리는 페이지의 링크를 통해 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/645992/sleep-until-a-specific-time-date
'programing' 카테고리의 다른 글
| NSUserDefaults에 사용자 지정 개체를 저장하는 방법 (0) | 2023.04.11 |
|---|---|
| 목록의 모든 요소가 고유한지 확인 (0) | 2023.04.11 |
| wpf 유형 이름 'App'이 유형에 없습니다.Main Window 이름 변경 후 발생 (0) | 2023.04.11 |
| 변수에 명령 출력을 저장할 때 줄 바꿈을 유지하는 방법은 무엇입니까? (0) | 2023.04.11 |
| Excel: 셀 문자열 값의 일부를 바꿉니다. (0) | 2023.04.11 |