[UNIX] crontab에서 자바프로그램 실행(한글문제 해결법)
일반적 환경이 설정되어 있는유닉스 서버에 telnet으로 로그인을 해서
Java 컴파일이나class를 실행하는 등 작업을 하면 잘 되는데
주기적으로 해야 하는 작업이 필요해 커맨드라인 명령을 똑같이 crontab에 등록을 하면
잘 실행되던 명령도 에러를 내면서 원하는 결과가 나오지 않는 경우가 자주 있다.
원인은 환경변수때문인데...
telnet으로 로그인 할경우 쉘의 종류에 따라서 유저의 홈디렉토리에 있는 .profile(본쉘), .cshrc(C쉘) 파일들이 마치 윈도우의 시작 프로그램처럼 자동으로 실행되어서 PATH, CLASSPATH, 터미널타입, 에디터, 프롬프트의 모양 등의 여러가지 환경변수들이 자동으로 설정된 상태에서 Java프로그램을 실행하기 때문에 명령줄 실행하는 것들은 잘 실행되는 것이다.
하지만 crontab으로 자바클래스을 실행하는 것은 telnet로그인과는 무관하기때문에 자바프로그램을 실행하는 스크립트를 만들어 실행전에 환경변수를 원하는 형태로 잡아주던가 아주 긴 형태의 자바실행명령(ex:java -classpath ...... -D...... )을 크론텝에 등록해줘야 한다.
게다가 자바에서 사용하는 유니코드와 UNIX시스템의 한글코드방식이 다른경우가 대부분이기때문에 Java프로그램에서 System.out.println(...)과 같은 Standard OUT의 내용과 File OUT등 한글 출력이 깨지게 된다.
해결 방법은 여러가지가 있지만... 본인은자바 환경변수 file.encoding을 지정하는 방법으로 해결했다. 사용하는 머신의 한글 엔코딩 방식을 알고 있다면 바로 적용하면 되고 잘 모른다면 한글 출력예제 프로그램을작성 해서 테스트 해보자
(샘플 다운로드 1176266469_EncodeingTest.java
EncodeingTest.java)
샘플 프로그램은 한글을 오라클 DB, System.out, file OUT 등으로 출력하는 프로그램이다.
/user/hantest/ 디랙토리를 생성하고
$java-Dfile.encoding=EUC_KR EncodingTest EUC_KR >> /user/hantest/EUC_KRSTD.out
$java-Dfile.encoding=8859_1 EncodingTest 8859_1 >> /user/hantest/8859_1STD.out
$java-Dfile.encoding=UTF_8 EncodingTest UTF_8 >> /user/hantest/UTF_8STD.out
등등 무식하게...(-.,ㅡa) 돌려보자
프로그램 내부에서 file io로 출력하는 .txt 파일과 STD OUT을 담는 .out 파일이 둘다 제대로 나오는 엔코딩 방식을 선택하면 된다.
위 샘플은 오라클 접속을 하기때문에 오라클 드라이버가 클래스패스에 잡혀있어야 제대로 동작한다.
DB한글 테스트가 필요 없는 경우에는 오라클 관련 부분을 제거하면 된다.
결론으로 우리서버의 경우 EUC_KR 방식이었다.
============================================================================================
#!/bin/sh
CLASSPATH=.:/user/java1.3.1/lib/dt.jar:/user/java1.3.1/lib/tools.jar:...생략..:
export CLASSPATH
cd /user/batch
java -Dfile.encoding=EUC_KR DailyCronbJob >> /user/batch/log/DailyCronbJob`date +%Y%m`.log
============================================================================================
SUN Os 5.6 에서 테스트한 샘플 입니다.
이렇게 쉘 스크립트를 작성해 주고
크론텝에 등록해 주면 완료