BASH - 변수의 날짜/시간 비교

BASH - 변수의 날짜/시간 비교

파일 st.txt:

"succeeded" "test" "2018-03-30T13:42:12Z" "2018-03-30T13:42:21Z"

최신 Rundeckjob 상태를 반환하는 스크립트가 있습니다.

curl -s -H "Accept: application/json" -X GET "http://localhost:4440/api/20/project/Windows-AD/executions?authtoken=r50onM4kXzZ7DhhAN6Fe2rwwxuAhF0IG"  | python -m json.tool > 1.json

jq -r '.|[.executions[] | select(.job.name != null)]  | sort_by(.id)  | reverse  | .[0]  | [.status, .job.name, ."date-started".date, ."date-ended".date] | @csv' 1.json > 1.csv

sed 's/,/ /g' 1.csv>st.txt
while read status name startdate enddate; do
case "$status" in
"\"aborted\"")
echo -1
;;
 "\"failed\"")
echo -1 +  $name
;;
 "\"succeeded\"")
echo 0
;;
*) echo 0 + $name
esac
exit 0
done<st.txt

2018-03-30T13:42:12Z" "2018-03-30T13:42:21Z"$start 및 $enddate (" )를 비교하고 차이가 5분보다 큰 경우 "너무 오래 걸림" 다른 종료를 추가하는 방법

답변1

다음과 같이 시작/종료 날짜를 변환하고 비교할 수 있습니다.

startdate=${startdate//\"/}
stime=$(date -d "${startdate/T/ }" +%s)
enddate=${enddate//\"/}
etime=$(date -d "${enddate/T/ }" +%s)
let elapsed=etime-stime
[ $elapsed -gt 300 ] && echo "taking too long"

답변2

GNU 날짜는 수학적 계산을 직접(초 단위) 수행할 수 있습니다.
POSIX 스크립트.

#!/bin/sh

sd='"2018-03-30T13:42:12Z"'
ed='"2018-03-30T13:42:21Z"' 

sd=${sd#\"}; sd=${sd%\"}    # Remove double quotes.
ed=${ed#\"}; ed=${ed%\"}

ep=$(date -d @0)              # Epoch date (anchor).
ss=$(date -d "$sd" +%s)       # Start time.
es=$(date -d "$ed" +%s)       # End time.
elapsed=$(date -d "$ep - ${ss}sec + ${es}sec" +%s)

if [ "$elapsed" -gt 300 ]]; then 
    echo "taking too long"
fi

관련 정보