MySQL → BigQuery 적재 작업을 6시간 윈도우(0~6, 6~12, 12~18, 18~24)로 돌리려 했는데, 실제 실행 로그는 00~04, 06~10처럼 4시간 간격으로 잘렸습니다.
#!/bin/bash
set -x
# ────────────────────────────────
# 0~6, 6~12, 12~18, 18~24 (총 4회)
# 마지막 구간은 오늘 날짜 테이블에 append
# ────────────────────────────────
YESTERDAY_DATE=$(date -d "yesterday" "+%Y-%m-%d")
YESTERDAY=$(date -d "yesterday" "+%Y%m%d")
TODAY_DATE=$(date "+%Y-%m-%d")
TODAY=$(date "+%Y%m%d")
source ~/.bashrc
for HOUR in 0 6 12 18; do
START_STR="${YESTERDAY_DATE} $(printf "%02d" $HOUR):00:00"
if [ "$HOUR" -eq 18 ]; then
# 마지막 구간: 어제 18시 ~ 오늘 00시
END_STR="${TODAY_DATE} 00:00:00"
TABLE_DATE="$TODAY"
else
END_STR=$(date -d "$START_STR +6 hours" "+%Y-%m-%d %H:%M:%S")
TABLE_DATE="$YESTERDAY"
fi
export START_STR
export END_STR
export YESTERDAY="$TABLE_DATE"
echo "${START_STR}"
echo "${END_STR}"
echo "▶ 실행: ${START_STR} ~ ${END_STR}"
done
하지만 결과는?
+ echo '2025-09-23 00:00:00'
2025-09-23 00:00:00
+ echo '2025-09-23 04:00:00'
2025-09-23 04:00:00
+ echo '▶ 실행: 2025-09-23 00:00:00 ~ 2025-09-23 04:00:00'
뭐지??????????????????????????????????????????????????????????????????????????????????
4는 아예 있지 도 않는데 왜 4를 더한거여?
코드에서 +를 뺴니 정상적으로 출력된다.
ND_STR=$(date -d "$START_STR 6 hours" "+%Y-%m-%d %H:%M:%S")
+ echo '2025-09-23 00:00:00'
2025-09-23 00:00:00
+ echo '2025-09-23 06:00:00'
2025-09-23 06:00:00
+ echo '▶ 실행: 2025-09-23 00:00:00 ~ 2025-09-23 06:00:00'
뭐지???
검색 결과 나와 같은 결과물을 겪은 사람들이 보였다.
https://community.unix.com/t/bug-in-gnu-date/374044
Bug in Gnu date?
So as I write this today is two days after the clocks go back here in the UK. I have a script that worked last week. Yesterday it developed a bug. I eventually found the culprit is Gnu Date. $ lsb_release -a No LSB modules are available. Distributor ID: Ub
community.unix.com
실제 원인
GNU date의 상대시간 파싱 케이스 때문
END_STR=$(date -d "$START_STR +6 hours" "+%Y-%m-%d %H:%M:%S")
Jenkins 로그에서 실제 결과가 +6h → +4h로 잘려 나오는 현상이 재현됨.
즉, "$START_STR +6 hours" 형태가 환경/버전에 따라 잘못 해석되는 문제가 있었고,
"$START_STR 6 hours" 또는 "6 hours $START_STR"처럼 쓰면 정상(+6h)으로 동작
Date 디버깅
1. UTC+06 로 변경
2. 섬머타임 1시간 적용
결국 -9+6+1로 4시간만 적용된것.
$ date --debug -d "$START_STR +6 hours" "+%Y-%m-%d %H:%M:%S"
date: parsed date part: (Y-M-D) 2025-09-23
date: parsed time part: 00:00:00 UTC+06
date: parsed relative part: +1 hour(s)
date: input timezone: parsed date/time string (+06)
date: using specified time as starting value: '00:00:00'
date: starting date/time: '(Y-M-D) 2025-09-23 00:00:00 TZ=+06'
date: '(Y-M-D) 2025-09-23 00:00:00 TZ=+06' = 1758564000 epoch-seconds
date: after time adjustment (+1 hours, +0 minutes, +0 seconds, +0 ns),
date: new time = 1758567600 epoch-seconds
date: timezone: system default
date: final: 1758567600.000000000 (epoch-seconds)
date: final: (Y-M-D) 2025-09-22 19:00:00 (UTC)
date: final: (Y-M-D) 2025-09-23 04:00:00 (UTC+09)
2025-09-23 04:00:00
+를 없애고 실행하면
1. +6시간 수행
으로 끝나서 원하는 결과값을 얻게 된다.
date --debug -d "$START_STR 6 hours" "+%Y-%m-%d %H:%M:%S"
date: parsed date part: (Y-M-D) 2025-09-23
date: parsed time part: 00:00:00
date: parsed relative part: +6 hour(s)
date: input timezone: system default
date: using specified time as starting value: '00:00:00'
date: starting date/time: '(Y-M-D) 2025-09-23 00:00:00'
date: '(Y-M-D) 2025-09-23 00:00:00' = 1758553200 epoch-seconds
date: after time adjustment (+6 hours, +0 minutes, +0 seconds, +0 ns),
date: new time = 1758574800 epoch-seconds
date: timezone: system default
date: final: 1758574800.000000000 (epoch-seconds)
date: final: (Y-M-D) 2025-09-22 21:00:00 (UTC)
date: final: (Y-M-D) 2025-09-23 06:00:00 (UTC+09)
2025-09-23 06:00:00
결론
리눅스 GUN date 함수를 쓸때는 꼭!꼭꼭! 확인하면서 쓰자...
(이걸로 오늘 오전이 날라갔다..)

'os > 리눅스' 카테고리의 다른 글
| [Linux] gzip - 압축하기, 압축풀기 (0) | 2025.07.01 |
|---|---|
| ubuntu docker (0) | 2018.10.24 |
| ubuntu init && node install (0) | 2018.08.19 |
| ubuntu port forwarding (0) | 2018.08.15 |
| ubuntu jupyter 설치 (0) | 2016.08.26 |