여러 셸 스크립트가 1시간 이상 지속되는지 어떻게 알 수 있나요?

여러 셸 스크립트가 1시간 이상 지속되는지 어떻게 알 수 있나요?

실행시간을 확인해서 1시간이 넘으면 오류를 반환하려고 하는데, 코드가 간헐적으로 오탐지를 반환하고 있습니다. 나는 firstRun.sh시간을 다음과 같이 읽었습니다.

export START_H=`date +%H`
export START_M=`date +%m`

그리고 secondRun.sh제가 확인한 당시에는 다음과 같습니다.

CURRENT_H=`date +%H`
CURRENT_M=`date +%M`
TIME=`expr $CURRENT_H - $START_H`

if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
    echo "boot time is more than an hour"
fi

문제가 어디에 있는지 알아내는 데 도움을 줄 수 있는 사람이 있나요? if 문에서 사용하는 것과 사용하는 것 &&사이에 차이점이 있습니까 ? -a아니면 []와 를 사용하는 것의 차이점은 무엇입니까 ()?

답변1

export BOOT_TIME=$(date +%s)
current=$(date +%s)
(( current - BOOT_TIME >3600 ))  && echo "More than an hour"

%s1970-01-01 00:00:00 UTC 이후의 초 수를 반환합니다.

토론: 초가 더 좋은 이유

예를 들어 시작(부팅) 시간이 23:00이고 현재 시간이 00:23이라고 가정합니다. 음수의 경우 $TIME에는 작동하지 않습니다.

if [ $TIME -gt 0 ] && [ $START_M -lt $CURRENT_M ]; then
    echo "boot time is more than an hour"
fi

마찬가지로 시작 시간은 12:03이고 현재 시간은 14:00이라고 가정합니다. 그런데 이번에는 미세한 테스트 때문에 위의 방법도 작동하지 않았습니다.

답변2

여기에는 두 가지 질문이 있습니다.

  1. 별도의 명령문에서 현재 시간의 시간과 분을 설정할 때 잠재적인 경쟁 조건이 있습니다(시간 위에 이동하는 분이 고려됨).

  2. 첫 번째 스크립트 조각에서는 %m몇 분을 사용합니다(그러나 실제로는 몇 달입니다). 두 번째에는 %M.

내 제안은 HHMM=$(date +'%H %M')두 부분으로 나누는 것이 낫다는 것입니다. 더 나은 방법은 시간을 epoch 이후의 결합된 초 값으로 처리 SECONDS=$(date --utc +'%s')하고 각 시간에 3600초를 포함하도록 허용하는 것입니다. (이 --utc섹션에서는 1년에 두 번 현지 시간이 변경되는 것을 방지합니다.)

관련 정보