카테고리 Archives: linux

crontab 에 등록된 스크립트의 한글 처리.

주기적인 작업을 crontab 에 등록하여 운영을 할때 캐릭터셋이 중요한 경우가 발생한다.
일반적으로 CentOS 리눅스 서버에는 i18n 설정이 되어 캐릭터셋이 운영 된다.

물론 CentOS7의 경우는 변경 되었다. ( /etc/locale.conf )

 

anyway.. cron 에 등록해서 적용하는경우 이러한 설정이 반영되지 않고 en_US가 기본 캐릭터셋으로 돌아간다 ‘ㅅ’a
때문에 캐릭터셋이 중요한 스크립트에서는 export LANG=ko_KR.eucKR 과 같이 선언을 하거나 source /etc/sysconfig/i18n내용을 호출하여 $LANG 가 정상 동작 하도록 한다 ‘ㅅ’a

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 처럼..)
받아서 쓰는 서버의 캐릭터셋이 예측할수 없을때 유용할 수 있음.

CentOS에서 whois 명령어를 이용한 도메인 정보 조회

CentOS 즉 레드햇 계열의 리눅스에는 jwhois 를 이용하여 linux 콘솔에서 도메인 정보조회를 할 수 있다.
설치는 yum 으로 진행을 할 수 있다.

사용법 다음과 같이 매우 간단하다.

 

다만 쓰다 보니 이것저것 불편한것이 많았다.

  1. new TLDs 가 전혀 조회가 되지 않는다.
  2. 브라우져에서 복사해서 바로 조회 할경우 http 혹은 https 까지 복제 되어 실패한다.

 

new TLDs 를 조회하기 위해서 /etc/jwhois.conf 파일을 새로운 conf 파일로 대체 한다.

 

whois 명령어를 조회해보니 아래와 같이 whois 명령어가 jwhois 명령어로 링크되어 있다.

때문에 먼저 whois 명령어를 삭제하고 새롭게 명령어를 만든다.

그리고 동작이 좀 더 되도록 입력값을 수정해서 작동되게 한다.

whois https://www.enteroa.com 이 된다.
아~ 편하다 ‘ㅅ’a

데이터베이스 마이그레이션

EUC-KR 에서 UTF-8 로 DB마이그레이션을 진행할때 캐릭터셋 전환에 따라 일부 문자가 유실 되거나 깨지게 되어 dump된 파일의 복구가 곤란한 경우가 발생하였다.

sql은 복원중 에러가 발생을 할경우 하위 내용을 복구를 하지 않기 때문에..
이러한 경우 보통 sql 파일을 하나하나 수정해가면서 다시 부어넣는 짓을 해야한다 =_=a

DB용량이 작다면 하나하나 수정해줄수 있지만 100M단위를 넘어가는 파일을 변경하긴 어렵다.
때문에 테이블 생성정보와 데이터를 따로 따로 백업을 하고 먼저 테이블을 생성한뒤에 복구하는 방법을 쓰기로 하고 스크립트를 작성하였다.

 

위와 같이 원본서버에서 백업을 할때 데이터를 분리 한뒤에 iconv를 이용해서 캐릭터셋 치환을 하고 캐릭터셋 선언을 바꾸어 준다.

이중 -c 옵션은 에러가 나는 문자열을 제외하고 치환하는 옵션이다.
가급적 에러가 나지 않는게 좋겠지만 ‘ㅅ’…

 

새로운 데이터 베이스에 먼저 테이블 복원을 한다.

아래와 같은 스크립트작성을 한 뒤에 실행한다.

IFS 를 통해 구분자를 엔터(\n) 으로 지정한뒤 for 문을 돌려 한줄한줄 복원을 시도 하고
에러가나는 구분은 error_query.sql 파일로 별도 저장을 한다.

추후 error_query.sql 파일을 분석하여 쿼리문을 완성 시켜 재 복원을 하거나… 버리거나.. 할수 있겠다.

 

테이블 복원중 VARCHAR(255) UTF8 is too long for key, but max length is 1000 bytes 가 나오는 경우가 발생할수 있다.

key로 사용되는 컬럼의 길이가 1000byte를 넘어가면 안된다는 메세지 이다.
(Mysql에서 UTF8의 경우 문자당 3byte 를 사용한다 – utf8mb4 = 4Byte 를 쓴다..)

이경우 key로 사용되는 컬럼의 varchar 값을 최대치인 333이하를 쓰도록 한다.
일반적으로 2개 이상의 컬럼은 하나의 키로 사용하는 부분에서 에러가 난다. 그때는 사용된 컬럼의 합이 333 이하여야 하겠다.

utf8mb4의 경우에는 200 이하로 해야겠고.. 그래서 대략 아래와 같이… 큰 varchar 컬럼을 앞95자까지 인식하도록 하게 한다.

 

mariaDB yum을 이용한 설치 ( CentOS 7 )

https://downloads.mariadb.org/mariadb/repositories

위 주소에서 먼저 맞는 OS 버전 및 설치할 mariaDB 선택한다 ‘ㅅ’a
20161114_picpick_161119

 

그후 나오는 내용을 레포지트리에 추가를한다.

 

그담 yum 으로 설치 고고싱.

 

초기 mysql 데이터폴더는 /var/lib/mysql 에 있다.
그래서 data 폴더를 이동하게 되는 경우에는 저 폴더를 다른 위치 및 이름으로 변경을 한다.
물론 /etc/my.cnf 에서 아래 부분을 찾아 고치는것도 병행해야 한다.
운영하려는 캐릭터셋에 맞게 설정을 추가하는것도 잊지 말자 (latin1 으로 깔리기 때문에….)

 

datadir에 selinux 설정을 한다

 

이후에 데몬 자동시작 등록 및 시작을 한다.

 

mysql 명령어로 mysql 에 로그인을 한뒤에 root 패스워드를 지정하고
보안을 고려하여 user 등이 비어있는 로그인정보 및 test 데이터베이스를 삭제해야 한다.

 

bash 에서의 멀티 쓰레드 구현

bash 는 단순히 순차 실행이 되는 구조이기 때문에 일반적으로 싱글 쓰레드로 볼 수 있다 ‘ㅅ’a
하지만 실행속도 향상을 위해 다중실행하는것이 유리 하다면 그렇게 만들면 되겠다 ‘ㅅ’a

리눅스는 기본적으로 프롬프트에서 background 실행을 할수 있다.
보통 백업을 할때 ‘ㅅ’a

 

이걸 응용하여 단순실행용 스크립트와  여러 명령어를 실행하는 스크립트를 두개를 만들어서 구성 해야 하겠지만..

여기서는  list 어레이에 선언된 숫자 값을 각 쓰레드에서 sleep 하는걸로…..
최대 리미트 $th 에 선언된 8의 갯수 만큼 동시실행을 하고 기존 프로세스들이 종료될 경우 추가 실행을 하도록 하였다 ‘ㅅ’a

  1. 백그라운드로 돌아가는 명령어
  2. 이를 확인하는 jabs 명령어
  3. 프로세스 종료를 기다리는 wait 명령어

위와 같은 명령어 조합으로 멀티쓰레드 구현이 간단히 되었다. 🙂

8쓰레드 의 단순 성능향상은 8배 이겠지만 단순히 8개 동시 실행을 하고 먼저 실행된 애들이 종료되면 순차실행을 하기 때문에..
에러이 선언된 시간들은 총 64초 이지만 멀티쓰레드 구현을 했을때에는 14초가 걸릴것이다 ‘ㅅ’a

 

PS. 싱글쓰레드에서 4분 56초 걸리는 작업 ( BIND[named.conf/zone] -> Pdns query )을 멀티쓰레드로 구현했을때 1분 44초가 걸렸다 ‘ㅅ’a