리눅스 시간대 설정과 시간 동기화 (timedatectl, chrony)
crontab에 새벽 3시로 걸어 둔 백업이 낮 12시에 돌거나, 로그 시간이 실제와 9시간 차이 난다면 서버 시간대가 UTC로 되어 있는 것이다. 이 글에서는 timedatectl로 하는 리눅스 시간대 설정 방법과 NTP 시간 동기화, 그리고 crontab, MySQL, Docker에서 시간대를 맞추는 방법까지 정리한다. 서버 기본 설정 순서는 리눅스 서버 초기 세팅 체크리스트에 있다.

현재 시간과 시간대 확인
timedatectl
datetimedatectl 결과에서 Time zone이 Etc/UTC (UTC, +0000)라면 한국 시간보다 9시간 느리게 표시된다. System clock synchronized가 yes인지도 함께 본다.
리눅스 시간대 설정 방법 Asia/Seoul
# 사용 가능한 시간대 찾기
timedatectl list-timezones | grep Seoul
# 시간대 변경
sudo timedatectl set-timezone Asia/Seoul
# 확인
timedatectl
datetimedatectl이 없는 오래된 시스템이나 컨테이너에서는 /etc/localtime 링크를 직접 바꾼다.
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtimeNTP 시간 동기화
시간대와 별개로, 서버 시계 자체가 조금씩 틀어지는 것을 막으려면 NTP 동기화를 켜 둬야 한다. 인증서 검증, 로그 분석, 분산 시스템은 시간이 몇 초만 틀려도 문제가 생긴다.
# 동기화 켜기 (Ubuntu 기본: systemd-timesyncd)
sudo timedatectl set-ntp true
timedatectl timesync-status
# Rocky / RHEL 기본: chrony
sudo systemctl enable --now chronyd
chronyc tracking
chronyc sources -v서비스 상태 확인은 systemctl 사용법을 참고하자. chrony에 대한 자세한 설명은 chrony 공식 사이트에 있다.
리눅스 시간대 설정 후 확인할 곳
crontab
cron은 시작할 때 읽은 시간대를 쓰는 경우가 있으므로, 시간대를 바꾼 뒤에는 cron을 재시작하자. 그래야 crontab에 적은 시간이 한국 시간 기준으로 동작한다.
# Ubuntu / Debian
sudo systemctl restart cron
# Rocky / RHEL
sudo systemctl restart crondMySQL
MySQL은 기본적으로 시스템 시간대를 따르지만, 설정에 따로 지정되어 있을 수 있다. NOW()가 원하는 시간을 돌려주는지 확인하자.
SELECT NOW(), @@global.time_zone, @@system_time_zone;Docker 컨테이너
컨테이너는 호스트 시간대를 물려받지 않고 기본이 UTC다. 실행할 때 TZ 환경 변수를 넘기거나 호스트의 /etc/localtime을 읽기 전용으로 연결한다. 옵션은 Docker 기본 명령어 글에 정리했다.
docker run -d -e TZ=Asia/Seoul --name app myimage
# 또는
docker run -d -v /etc/localtime:/etc/localtime:ro --name app myimage리눅스 시간대 설정 정리
시간대는 서버를 받자마자 맞춰 두는 것이 좋다. 운영 중에 바꾸면 그 사이의 로그와 예약 작업 시간이 섞여 혼란스러워진다. timedatectl set-timezone 한 줄과 set-ntp true 한 줄이면 대부분의 문제가 끝난다. 다만 여러 나라 사용자를 다루는 서비스라면 서버는 UTC로 두고 애플리케이션에서 시간대를 변환하는 방식도 많이 쓴다는 점은 알아 두자. 명령 옵션 전체는 timedatectl 공식 매뉴얼에서 볼 수 있다.
첫 댓글을 남겨보세요