주기적인 작업을 crontab 에 등록하여 운영을 할때 캐릭터셋이 중요한 경우가 발생한다.
일반적으로 CentOS 리눅스 서버에는 i18n 설정이 되어 캐릭터셋이 운영 된다.
물론 CentOS7의 경우는 변경 되었다. ( /etc/locale.conf )
anyway.. cron 에 등록해서 적용하는경우 이러한 설정이 반영되지 않고 en_US가 기본 캐릭터셋으로 돌아간다 ‘ㅅ’a
때문에 캐릭터셋이 중요한 스크립트에서는 export LANG=ko_KR.eucKR 과 같이 선언을 하거나 source /etc/sysconfig/i18n내용을 호출하여 $LANG 가 정상 동작 하도록 한다 ‘ㅅ’a
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash if [[ -z `echo $LANG|grep -iE "euckr|utf-8"` ]];then if [[ -e /etc/sysconfig/i18n ]];then source /etc/sysconfig/i18n elif [[ -e /etc/locale.conf ]];then source /etc/locale.conf fi fi fcher=`file -i $0|awk '{if(/utf-8/||/UTF-8/)print"utf-8";else print"euckr"}'` tcher=`echo $LANG|awk '{if(/utf-8/||/UTF-8/)print"utf-8";else print"euckr"}'` ch="iconv -f $fcher -t $tcher" echo "가나다라마바사아자차카타파하"|$ch >> /opt/cron_logs |
echo $LANG 의 값이 euckr 혹은 utf8이 아닐 경우 i18n 혹은 locale.conf 을 불러오거나 현재 문서의 인코딩 셋을 LANG 으로 지정하도록 만든 로직 이다 ‘ㅅ’a (centos5 이하의 file 명령어 버전 차이때메동작 제대로 안됨..)
일반적으로 utf8서버에서 생성된 파일은 utf-8인코딩 셋일 꺼고 euc-kr 에서 생성된 파일은 euckr 문서일꺼기 때문에 =_=a
일반적인 상황에서는 export LANG=utf8 과 같은 선언으로도 충분하다.
다만 서버 관리 특성상 shell script의 버전관리를 통해 자동 배포를 하고(svn 혹은 git 처럼..)
받아서 쓰는 서버의 캐릭터셋이 예측할수 없을때 유용할 수 있음.