현재 시간이 23:00에서 06:30 사이인 경우 bash 스크립트에서 올바르게 확인하는 방법을 알 수 없습니다. 지금 시간을 확인하고 시간 범위가 오후 11시에서 오전 6시 30분 사이일 때 일부 작업을 수행하기 위해 무한 루프를 실행하려고 합니다. 이것은 내가 지금까지 쓴 내용이며 다음 날에는 작동하지 않았습니다.
fireup()
{
local starttime=$(date --date="23:00" +"%s")
local endtime=$(date --date="06:30" +"%s")
while :; do
local currenttime=$(date +%s)
if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
local currenttime=$(date +%s)
done &
}
내가 뭘 잘못했나요?
답변1
필요한 것이 23:00에서 06:30 사이인지 확인하는 것뿐이라면 HH:MM
Unix 타임스탬프를 사용하지 마세요. HH:MM
값을 직접 확인하세요 .
fireup()
{
while :; do
currenttime=$(date +%H:%M)
if [[ "$currenttime" > "23:00" ]] || [[ "$currenttime" < "06:30" ]]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
done &
}
노트:
- 시간은
HH:MM
사전식 순서이므로 문자열로 직접 비교할 수 있습니다. - 사용을 피하세요
-a
또는-o
[ ]
, 사용||
및&&
대체. - bash이기 때문에
[[ ]]
선호하세요[ ]
. 삶이 더 편해집니다.
답변2
일치시키려는 시간을 더 명시적으로 지정하려면 명령문을 사용할 수 있습니다 case
. 다음은 현재 시간이 범위와 일치하는지 여부를 나타내는 Case 문이 포함된 24시간 루프입니다.
for hh in {00..23}
do
for mm in {00..59}
do
case $hh:$mm in
(23:*) echo YES $hh:$mm;;
(0[012345]:*) echo YES $hh:$mm;;
(06:[012]*) echo YES $hh:$mm;;
(*) echo NO $hh:$mm;;
esac
done
done
스크립트에서 사용하려면 변수를 호출로 바꾸십시오 date
.
case $(date +%H:%M) in
(23:*) echo YES;;
(0[012345]:*) echo YES;;
(06:[012]*) echo YES;;
(*) echo NO;;
esac
CPU 친화적인 방법을 고려하고 (현재)와 다음 시작 시간 사이의 시간을 계산할 수 있습니다.sleep
그 시간 동안.
답변3
"오늘"이 시작된 이후의 시간을 초로 변환한 다음 초 값이 (82800)보다 크 거나 (23400) 23*60*60
보다 작은 지 확인할 수 있습니다.6*60*60+30*60
"오늘"이 시작된 이후의 시간(초)을 얻으려면 다음을 수행할 수 있습니다.
secsSinceMidnight=$(( $(date +%s) - $(date -d '00:00:00' +%s) ))
테스트는 다음과 같습니다:
[[ $secsSinceMidnight -lt 23400 || $secsSinceMidnight -gt 82800 ]] && echo YES
답변4
나는 비슷한 상황에 처해 있습니다. 나의 목표는 UNIX 전문가가 아닌 사람들이 유지 관리하기 매우 쉬운 솔루션을 제공하는 것입니다.
내 Linux 서버가 재부팅되면 경고를 보내는 스크립트가 실행됩니다. 그러나 이 문제가 "유지 관리 기간"(토요일 오후 11시부터 일요일 오전 6시 사이로 정의됨) 중에 발생하는 경우 이 기간 동안 재부팅해도 문제가 없으므로 페이지를 보내고 싶지 않습니다(패치 적용 등). 테스트해본 결과 예상대로 작동했습니다(내가 아는 한).
참고용 달력은 다음과 같습니다.
June 2018
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
이것은 내 테스트 코드입니다.
FMT='+%k:%a' # i.e. Sat:23 for Saturday at 11pm local time
TESTDATE1=$(date -d '2018-06-23 14:30:00' $FMT)
TESTDATE2=$(date -d '2018-06-23 23:59:59' $FMT)
TESTDATE3=$(date -d '2018-06-24 00:00:00' $FMT)
TESTDATE4=$(date -d '2018-06-24 05:59:59' $FMT)
TESTDATE5=$(date -d '2018-06-24 08:01:00' $FMT)
for VAL in "${TESTDATE1}" $TESTDATE2 $TESTDATE3 $TESTDATE4 $TESTDATE5
do
#extract the 24 hour value and the day
HH="$(echo ${VAL} | cut -d':' -f1)"
DAY="$(echo ${VAL} | cut -d':' -f2)"
echo Testing $VAL $HH $DAY
if [[ "$DAY" = "Sat" && $HH -ge 23 ]]; then
echo ' Shhhh People are trying to sleep ... Sat window'
elif [[ "$DAY" = "Sun" && $HH -le 6 ]]; then
echo ' People are trying to sleep ... Sun window'
else
echo ' PAGE SOMEONE - time is outside the Maintenance Window'
fi
done
이것이 출력이다
Testing 14:Sat 14 Sat
PAGE SOMEONE - time is outside the Maintenance Window
Testing 23:Sat 23 Sat
Shhhh People are trying to sleep ... Sat window
Testing 0:Sun 0 Sun
People are trying to sleep ... Sun window
Testing 5:Sun 5 Sun
People are trying to sleep ... Sun window
Testing 8:Sun 8 Sun
PAGE SOMEONE - time is outside the Maintenance Window