Posts

Server and Tomcat Time Set

문제점

매일 13시에 특정 기능이 수행되도록 스케줄링을 설정해두었다. 스케줄링은 정상적으로 실행되었지만 13시가 아닌 전혀 다른 시간에 수행되었다.

파악

스케줄링이 실행되었기 때문에 코드 상의 문제는 없으며 이상한 시간에 실행되었기 때문에 시간 설정을 찾아봐야겠다고 생각했다.

서버 시간 확인하기

우선, 서버의 시간을 확인하기 위해 date 명령어를 사용했다.

Thu Jan  2 01:12:50 PM KST 2025

문제는 없었다.

톰캣 시간 확인하기

그럼 뭐가 문젤까? 하고 생각하다 톰캣의 시간이 서버의 시간과 별개라는 것을 알게 되었다. 여러 블로그를 참고해 아래와 같은 방법으로 시간을 설정했다.

setenv.sh 생성

필자가 사용하는 tomcat8은 setenv.sh가 기본적으로 존재하지 않기 때문에 생성해야 한다. 톰캣의 bin 디렉터리 아래에 setenv.sh로 생성해야 tomcat이 해당 파일을 읽을 수 있다.

vi /usr/local/apache-tomcat-8.5.56/bin/setenv.sh

내부에는 아래의 내용을 작성한다. 아래 옵션은 UTF8로 문자 인코딩을 설정하고, JVM의 시간대 (timezone)을 한국 표준시로 설정함을 의미한다.

1
2
3
#!/bin/bash

export CATALINA_OPTS="$CATALINA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=GMT+9"

3. tomcat 재시작

1
2
3
4
5
14:24:14.003 ...
14:24:14.003 ...
14:24:14.046 ...
14:24:14.605 ...
14:24:14.605 ...

이후 log에 찍히는 시간이 현재 시간과 동일한 것을 확인할 수 있다.

스케줄링 결과

(확인 중)

Error List

처음에 #!/bin/bash이 없이 setenv.sh를 생성하고 chmod로 실행 권한을 부여한 후 실행했다. 그 결과, 서버 접속이 되지 않았다! HTTP 404 오류만 발생하고 별다른 로그조차 확인할 수 없었다. 이후 사수님께서 다시 setenv.sh를 만들어 설정해주시고 나서야 서버는 제시간을 출력하며 문제 없이 돌아갔다.

사수님께서 작성한 setenv.sh와 내 것을 확인하니 #!/bin/bash가 없고, 실행 권한을 부여하지 않았다는 차이가 있었다.

#!란?

단순히 #이 있길래 주석이라고 생각했는데 아니었다! #!는 표시자로, 시스템에 어떤 명령어 해석기의 명령어 집합인지를 알려주는 역할을 한다. 즉, #!/bin/bash를 상단에 작성했다면, 시스템은 해당 파일이 리눅스의 기본 쉘인 bash 명령어임을 파악할 수 있게 되는 것이다.

확장자가 .sh (쉘 스크립트)이니 당연히 bash 명령어 해석기를 통해 실행될 것이라고 판단했던 것과 #가 있다고 주석이라고 생각했던 것이 문제였다.

실행 권한

실행 권한을 준 것 때문에 오류가 발생한 것인지는 명확하지 않으나1, 실행 권한을 주지 않았는데도 환경 변수가 적용되는 것은 의아했다. 아래는 개인적으로 찾아 본 내용으로, 정확하지 않을 수 있다. 조금 더 공부해서 추후 수정하거나 내용을 추가할 생각이다.

톰캣의 catalina.sh 파일에는 자바 옵션 설정 / 톰캣 로그 경로 등의 설정을 저장할 수 있으며, setenv.sh 파일의 옵션을 등록한다. 이후 톰캣 구동 (./startup.sh) 시 catalina.sh를 실행하고, catalina.sh 내부에서 setenv.sh를 읽어 환경변수를 가져와 적용하기 때문에 실행 권한을 주지 않아도 설정이 반영된다.

참고

#!/bin/bash에서 #!는 무슨 뜻인가?
창문닦이 님 - catalina.sh와 setenv.sh


  1. 테스트를 더 해보고 싶었지만 테스트를 위한 서버가 없어서 시도하지 못했다. 실서버를 더 건들다가 어떤 오류가 발생할 지 모르니 시도 하기 좀 무서웠다. ↩︎

이 포스트는 저작권자의 CC BY 4.0 라이센스를 따릅니다.