몇몇 시스템에서 Business layer 에서 발생한 Exception 을 특정한 Error 처리/감지용 Exception class 로 Wrapping 하여 throw 하는 경우가 있다.
Wrapping 하게 되면, Exception 을 감지할 수 있는 Monitoring tool 에 감지가 되지 않는 단점이 있는데, 이것을 아래와 같은 Code 로 다시 한 번 Exception 을 throw 하여 H/W failure 같은 상황을 감지할 수 있다.
이 방법은 내 생각엔, 아주 특수한 경우에만 적용할 수 있을 것 같다. 그렇지 않으면 같은 Exception 이 매우 여러 갈래로 전단에 위치한 Monitoring tool 까지 전파된다.
try {
// DO SOMTHING USEFUL
} catch (e) {
// Make Exception Object
throw ExceptionObject();
} finally {
if ( OccuredException is System Exception ) {
// Make System Exception Object
throw SystemExceptionObject();
}
}
2011년 11월 16일 수요일
2011년 11월 13일 일요일
Fabric 설치 방법
Python 프로그래밍 언어로 작성된 Fabric 의 설치 방법을 정리하였다. Fabric 은 ssh2 기반으로 Deploy 작업을 단순화+자동화 해줄 수 있는 모듈이다. 자세한 소개는 생략한다.
이 Post 에서는 Python 2.7.2 (UNIX) + Fabric 1.3.2 기준으로 설명된다.
1) Python 인터프리터 프로그램
http://www.python.org/download/ 위치에서 자신에게 필요한 버젼을 download 한다. 이 Post 에서는 Python-2.7.2.tar.bz2 를 다운로드 하였다.
2) setuptools - Python 모듈
setuptools 는 Python 모듈을 쉽게 설치/제거 할 수 있는 admin utility 이다. http://pypi.python.org/pypi/setuptools/0.6c11#downloads 에서 egg 파일을 다운로드 받는다.
3) SSH - Python 모듈
SSH 모듈을 여기에서 다운로드 받는다.
4) PyCrypto - Python 모듈
SSH 암호화 모듈을 여기에서 다운로드 받는다.
5) Fabric 1.3.2 - Python 모듈
Fabric 모듈을 여기에서 다운로드 받는다.
※ Fabric 이 제공하는 Multiprocessing 기능을 이용하려면, 따로 multiprocessing 모듈을 추가 설치하거나, Python 을 2.6 버젼 이상을 갖고 있어야 한다.
1) Python 프로그램
#> bunzip2 Python-2.7.2.tar.bz2
#> tar -xvf Python-2.7.2.tar
#> ./configure
#> make
#> make install
2) setuptools 0.6c11
#> sh setuptools-0.6c11-py2.7.egg
3) PyCrypto
#> gzip -d pycrypto-2.4.1.tar.gz
#> tar -xvf pycrypto-2.4.1.tar
#> python setup.py install
4) SSH 모듈
#> gzip -d ssh-1.7.9.tar.gz
#> tar -xvf ssh-1.7.9.tar
#> python setup.py install
5) Fabric
#> gzip -d fabric-1.3.2.tar.gz
#> tar -xvf fabric-1.3.2.tar
#> python setup.py install
아래 내용을 참고하여 Fabric 이 잘 설치되었는지 확인한다.
1) 텍스트 에디터로 밑에 소스 코드를 입력하고 fabfile.py 로 저장한다.
2) Shell 상에서 아래와 같이 입력하였을 때, print() 에 넣은 Hello World! 가 정상 출력되면 OK
/usr/local/lib/python2.7/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.
libgmp 는 시스템에 설치되어 있는 라이브러리 인데, libgmp.so 파일의 버젼이 fab 가 요구하는 수준보다 낮아서 그런 것 같다. 그래서 libgmp 를 에러 로그에서 보았던 데로 5 이상 버젼을 설치한 후 Python 을 다시 compile 하여 재설치 하였다. 테스트하는 system 이 redhat 이 설치되어 있는데, 구성한지 오래되어 그럴 수도 있다.
이 Post 에서는 Python 2.7.2 (UNIX) + Fabric 1.3.2 기준으로 설명된다.
- Download 할 파일들
1) Python 인터프리터 프로그램
http://www.python.org/download/ 위치에서 자신에게 필요한 버젼을 download 한다. 이 Post 에서는 Python-2.7.2.tar.bz2 를 다운로드 하였다.
2) setuptools - Python 모듈
setuptools 는 Python 모듈을 쉽게 설치/제거 할 수 있는 admin utility 이다. http://pypi.python.org/pypi/setuptools/0.6c11#downloads 에서 egg 파일을 다운로드 받는다.
3) SSH - Python 모듈
SSH 모듈을 여기에서 다운로드 받는다.
4) PyCrypto - Python 모듈
SSH 암호화 모듈을 여기에서 다운로드 받는다.
5) Fabric 1.3.2 - Python 모듈
Fabric 모듈을 여기에서 다운로드 받는다.
※ Fabric 이 제공하는 Multiprocessing 기능을 이용하려면, 따로 multiprocessing 모듈을 추가 설치하거나, Python 을 2.6 버젼 이상을 갖고 있어야 한다.
- Installation
1) Python 프로그램
#> bunzip2 Python-2.7.2.tar.bz2
#> tar -xvf Python-2.7.2.tar
#> ./configure
#> make
#> make install
2) setuptools 0.6c11
#> sh setuptools-0.6c11-py2.7.egg
3) PyCrypto
#> gzip -d pycrypto-2.4.1.tar.gz
#> tar -xvf pycrypto-2.4.1.tar
#> python setup.py install
4) SSH 모듈
#> gzip -d ssh-1.7.9.tar.gz
#> tar -xvf ssh-1.7.9.tar
#> python setup.py install
5) Fabric
#> gzip -d fabric-1.3.2.tar.gz
#> tar -xvf fabric-1.3.2.tar
#> python setup.py install
- Verification
아래 내용을 참고하여 Fabric 이 잘 설치되었는지 확인한다.
1) 텍스트 에디터로 밑에 소스 코드를 입력하고 fabfile.py 로 저장한다.
def hello():
print("Hello World!")
2) Shell 상에서 아래와 같이 입력하였을 때, print() 에 넣은 Hello World! 가 정상 출력되면 OK
- 추가 Library dependency
/usr/local/lib/python2.7/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.
libgmp 는 시스템에 설치되어 있는 라이브러리 인데, libgmp.so 파일의 버젼이 fab 가 요구하는 수준보다 낮아서 그런 것 같다. 그래서 libgmp 를 에러 로그에서 보았던 데로 5 이상 버젼을 설치한 후 Python 을 다시 compile 하여 재설치 하였다. 테스트하는 system 이 redhat 이 설치되어 있는데, 구성한지 오래되어 그럴 수도 있다.
MD5 에 대하여
파일 중복 검사 Python script 를 작성하기 위하여, 파일 무결성 검사에 사용할 수 있는 MD5 암호화 해시 알고리즘에 대하여 자료 조사를 하였다.
- Definition from wikipedia.org
MD5(Message-Digest algorithm 5)는 128비트 암호화 해시 함수이다. RFC 1321로 지정되어 있으며, 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다. 1991년에 로널드 라이베스트가 예전에 쓰이던 MD4를 대체하기 위해 고안했다.
1996년에 MD5의 설계상 결함이 발견되었다. 이것은 매우 치명적인 결함은 아니었지만, 암호학자들은 해시 용도로 SHA-1와 같이 다른 안전한 알고리즘을 사용할 것을 권장하기 시작했다. 2004년에는 더욱 심한 암호화 결함[1]이 발견되었고. 2006년에는 노트북 컴퓨터 한 대의 계산 능력으로 1분 내에 해시 충돌을 찾을 정도로 빠른 알고리즘이 발표[2]되기도 하였다. 현재 MD5 알고리즘을 보안 관련 용도로 쓰는 것은 권장하지 않으며, 심각한 보안 문제를 야기할 수도 있다. 2008년 12월에는 MD5의 결함을 이용해 SSL 인증서를 변조하는 것이 가능하다는 것이 발표되기도 했다[3].
- 작동 방식
- 정리
그렇기 때문에 아주 철저한 검사가 필요한 경우에는 MD5 로 무결성 검사하는 것은 맞지 않으며 더욱이 암호화 알고리즘으로는 맞지 않다.
- 무결성 검사에 사용하는 방법
어떤 파일의 MD5 값을 출력하고자 한다면 MD5 알고리즘의 입력에 파일의 내용을 넣으면 된다. 그러면 알아서 MD5 값인 128비트 스트링이 출력된다.
이런 MD5 값을 산출할 수 있는 많은 유틸리티가 인터넷에 공개되어 있으므로 2~3분만 구글링하면 쉽게 유틸리티를 구할 수 있을 것이다.
이런 MD5 값을 산출할 수 있는 많은 유틸리티가 인터넷에 공개되어 있으므로 2~3분만 구글링하면 쉽게 유틸리티를 구할 수 있을 것이다.
2011년 11월 8일 화요일
HTML5 링크 모음
http://playground.html5rocks.com
구글에서 만든 사이트로, HTML5 의 예제 Code 들이 충실하게 구현되어 있다.
Chrome 에서만 동작 테스트 하였음
http://ujeani.wordpress.com/
Phonegap + jQuery Mobile 개발 환경 셋업에 대하여
구글에서 만든 사이트로, HTML5 의 예제 Code 들이 충실하게 구현되어 있다.
Chrome 에서만 동작 테스트 하였음
http://ujeani.wordpress.com/
Phonegap + jQuery Mobile 개발 환경 셋업에 대하여
HTML5 Web Socket
- 등장 배경
기존 Web 통신은 모두 클라이언트(Browser) 의 요청 --> Server 의 응답 형식이었다. Polling 방식 + 단방향 통신으로 IO 를 구현해온 것이다. 그래서 Web 환경에서 채팅 기능을 구현하려면 클라이언트는 일정 주기 별로 계속 서버에 메시지 도착 유무를 판단하기 위하여 Polling 해야 한다.
HTML5 에서는 Established 된 TCP 연결을 통해서 양방향이 동시 통신을 할 수 있게 되었다. 이것을 프로그래머 입장에서 좀 더 귀가 트이게 이야기 하자면, Mobile Web application 에서 PUSH 기능을 쓸 수 있게 된 것이다.
- 성능의 향상
기존 Web 통신에서 그나마 쓸만한 것이 Ajax 이었다. 만약 똑같은 기능을 Web socket 과 Ajax 로 구현하면 그 성능 차이는 어떨까?
인터넷에서 조금만 구글링 해보면 Performance 테스트한 결과들을 쉽게 볼 수 있는데, 정량적인 수치를 단언하긴 힘들지만 일반적으로 30배 이상 속도가 빠르다. 그럴 수밖에 없는 것이, Ajax 는 호출 할 때마다 연결을 새롭게 해야 한다. 그렇기 때문에 송신해야 하는 Data 는 HTTP 헤더 정보를 포함해서, 항상 더 많다. 반면에 Web socket 은 Established 된 TCP 연결 상에서 필요한 Data 만 바로 보내면 되기 때문에, 클라이언트와 Server 사이의 대역폭을 훨씬 효율적으로 사용할 수 있게 된다.
- 구현하는 방법
Javascript 내에서 간략하게 Web socket 기능을 구현해서 쓸 수 있다. 객체를 만들고 Event Handler 를 부착하기만 하면 된다.
<script lang="javascript"> var ws = new WebSocket("http://yourdomain.com");
// PUSH Message Handler ws.onmessage = function(msg) { alert(msg.data); } // Connection Established ws.onopen = function(msg) { alert("Connection Established"); }
// Connection Closed ws.onclose = function(msg) { alert("Connetion Ended"); }</script>
2011년 11월 2일 수요일
FIFA Manager 12 나이가 저장되는 방식
Electronic Arts 의 FIFA Manager 12 게임에서는 각 선수들의 나이를 Julian Date(율리우스 력)으로 저장합니다. 그런데 우리가 사용하는 달력은 Glegorrian Calendar(그레고리 력) 라서, 둘 사이에 차이가 있습니다.
그레고리 력 에 대해서 보기
율리우스 력 에 대해서 보기
예를 들어 선수의 생년월일이 1984년 7월 21일 이라면, 현재 우리가 사용하는 그레고리 력에 의해서 그 생년월인은 30844 의 십진수 값으로 변환되어 컴퓨터 내에 저장됩니다.
그렇지만 FIFA Manager 12 에서는 율리우스 력을 사용하기 때문에 2445903 라는 값으로 저장됩니다.
그러므로 선수의 나이를 에딧하기 위해서 생년월일을 율리우스 력으로 변환하여 찾으면 됩니다.
그레고리 력을 율리우스 력으로 변환 해주는 사이트
FIFA Manager 12 감독 돈 올리기 (쉬운 방법)
아래 동영상을 참고 하셔서 Edit 하면 돈이 Trillion 단위로 늘어납니다.
예전 피파 매니져 버전들의 private_item 고치는 것과 비슷하고, 고치는 액수를 10^24 (10의 24승) 으로 하면 늘릴 수 있습니다.
예전 피파 매니져 버전들의 private_item 고치는 것과 비슷하고, 고치는 액수를 10^24 (10의 24승) 으로 하면 늘릴 수 있습니다.
2011년 10월 20일 목요일
FIFA Manager 12 치트 (돈 늘리기)
FIFA MANAGER 12 에서 메모리 에딧으로 감독의 게임 머니를 증가시키는 방법입니다.
1. TSearch 를 다운 받아 실행할 준비 해둡니다.
2. 감독 개인 생활 메뉴로 가서, Stock Market 으로 갑니다.
3. 주당 가격이 가장 비싼 구단의 주식을 삽니다.
4. TSearch 에서 구매한 주식의 값을 Search 합니다.
5. 게임에서 주식을 더 구매합니다.
6. 4의 결과에서 증가한 주식의 수치만큼을 다시 검색합니다.
7. 결과가 3개가 될 때까지 5~6을 반복합니다.
8. 결과가 3개가 되면, 가장 밑에 있는 (메모리 주소값이 가장 큰) 것을 더블 클릭하여 999999999 로 고칩니다.
9. 게임으로 가서 주식을 9주만 남기고 모두 팝니다. 만약 모두 다 팔면 검색 과정을 다시 되풀이 해야 되므로 9주를 남깁니다.
10. TSearch 로 가면 99..99 인 값이 9로 되어 있을 겁니다. 이것을 다시 999999999 로 늘립니다.
11. 원하는 액수가 될 때까지 9~10 반복합니다.
12. 개인 자산이 늘어나면, 클럽에 기부 등을 하여 원하는 일을 할 수 있게 됩니다.
Shell Prompt 모양 바꾸기
프롬프트의 모양을 변경할 host 의 사용하는 계정의 shell profile 에 아래 내용을 추가한다.
PS1="`hostname`@$LOGNAME:\$PWD # "
export PS1
shell profile 은 대게 로그인 한 계정의 홈 디렉토리에 profile 이란 이름으로 존재한다. 파일의 위치와 모양은 시스템의 설정에 따라 다를 수 있으므로 주의.
이렇게 설정하면,
(호스트 이름)@(로그인계정):\(현재디렉토리) #
와 같은 형태로 프롬프트가 변경된다.
한글/중문/영문 직급 이름
회장 : Chairman of the Board(of Directors) 명예회장 : Honorary Chairman
부회장 : Vice Chairman & CEO 대표(사장) : President 또는 Representative
부사장 : Senior Executive Vice President 전무이사/전무 : Senior Managing Director
상무이사/상무 : Managing Director 이사/이사대우 : Director
상임고문 : Executive Advisor 감사 : Auditing Director 또는 Auditor
고문/자문 : Advisor 소장 : Director 지점장 : Branch Manager
공장장 : Plant Manager 또는 Factory Manager
부장 : General Manager 또는 Department Manager 본부장 : Devision Director
부장대리 : Deputy General Manager(또는 Acting General Manager)
차장 : Deputy General Manager 원장(의료기관) : Chief of Medical Clinic
관장(미술관등) : Director 비서실 : Office of the Secretary
본사 : Head office 실장,주사 : Manager 과장 : Manager 또는 Section Chief
과장대리 : Acting Manager 대리 : Assistant Manager
계장 : Subsection Chief 또는 Senior Staff 주임 : Assistant Manager , Supervisor
주임기사 : Staff Enginner 기사 : Enginner 수석연구원 : Principal Research Engineer 책임연구원 : Senior Research Engineer
선임연구원 : Research Engineer 전임연구원 : Associate Research Engineer
고문변호사 : Legal Adviser 또는 Corporate Lawyer
촉탁사원 : Non-Regular Staff 주임연구원 : Assistant Research Engineer
상임고문 : Excutive Advisor 전문위원 : Research Fellow
기획실 : Planning Team 법무팀 : Law Dept. 총무부 : General Affairs Dept.
인사과 : Personnel Section 홍보실 : Public Relations Section
시설관리부 : Facilities Management Dept. 전략기획팀 : Plan Dept.
해외사업팀 : International Development Dept.
영업기획팀 : Sales Planning Team 영업1팀 : Sales Team 1
부산지사(지점) : Busan Branch 구매부 : Purchasing Dept.
재경부 : Finance & Accounting Dept. 경영개선팀 : Management Improving Team
고객만족실 : General Affairs Dept. 기술지원팀 : Technical Support Team
해외사업부 : Overseas Business Division 국내물류부 : Logistics Managemet Dept.
연구기획팀 : R&D Planning Team 통신연구소 : Communication Research Center
연구실 : R&D Lab. 생산관리팀 : Manufacturing Control Team
공장관리팀 : Factory Planning Team 품질관리팀 : Quality Contorl Team
●「~部」는 ~Department、「~課」는~Section、「~室」은~Office 라고 표기함
회 장 會長 Chairman 부회장 副會長 Vice Chairman 사 장 社長 President
부사장 副社長 Senior Executive Vice Presiden 전무이사.전무 專務理事 Senior Managing
Director 상무이사.상무 常務理事 Managing Director
이사.이사대무 理事 Director 감 사 監事 Auditor General 고문.자문 顧問
Advisor 부 장 部長 General Manager 본부장 本部長 Director
부장대리 部長代理 Deputy General Manager 차 장 次長 Deputy General Manager
실 장 室長 General manage 과 장 課長 Manager 대 리 代理 Assistant manager
계 장 係長 Chief 주 임 主任 Assistant manager, Supervisor
주임기사 主任技士 Staff engineer 기 사 技士 Engineer
수석연구원 首席硏究員 Principal Research Engineer
책임연구원 責任硏究員 Senior Research Engineer
선임연구원 先任硏究員 Research Engineer
전임연구원 傳任硏究員 Ssociate Research Engineer
주임연구원 主任 Assistant Research Engineer
상임고문 常任顧問 Executive Advisor 전문위원 專門委員 Research Fellow
법무팀 法務硏究員 Law Dept. 전략기획팀 戰略企劃 lan Dept.
해외사업팀 海外事業 International Development Dept.
기 획 실 企 劃 室 Planning Dept 고객만족실 顧客滿足室 General Affairs Dept
총 무 부 總 務 部 General Affairs Dept 경 리 부 經 理 部 Accounting Dept
택배업무부 宅配業務部 Parcel Service Support Dept
택배영업부 宅配營業部 Parcel Service Sales Dept
택배마케팅부 宅配마케팅部 Marketing & Pricing Dept
시설관리부 施設管理部 Facilities Management Dept
국내물류부 國內物流部 Logistics Management Dept
물류개발부 物流開發部 Third Party Logistics Dept
항공업무부 航空業務部 Air Operation Dept
해운업무부 海運營業部 Ocean Operation Dept
해운영업부 海運營業部 Ocean Sales Dept
경영개선팀 經營改善 Management Improving Team e- BIZ부
e-BIZ部 e-Business Dept
[출처] 영어 직급작성자 다크
클라우드 컴퓨팅 설명/전망
- 클라우드 컴퓨팅의 정의
- 가상화가 클라우드 컴퓨팅에 기여한 점
때문에 일부분 밖에 사용되지 않는 리소스들의 여력을 가상화로 묶어서 하나의 자원으로 활용할 수 있게 한다.
그리드 컴퓨팅과 다른 점은 유휴의 자원을 묶되 네트워크 상의 모든 컴퓨팅 자원을 활용하는 것이 아니라, 개별 사업자가 소유하고 있는 자원을 가상화를 통해 리소스 풀을 구성하는 것이 다르다. 그리드 컴퓨팅은 네트워크 상의 활용 가능한 모든 컴퓨팅 자원을 묶는다.
- 구글의 클라우드 컴퓨팅
- 클라우드 컴퓨팅이 가진 한계와 단점
- 서비스 안정성에 대한 불안
- 자료에 대한 불안감
- 낮은 표준화 수준으로 서비스 제공자 간의 자료 이동이 어려움
- 아직 성숙하지 않은 시장
Welogic 어드민 암호 재설정 (Weblogic 9 이상)
- 암호를 변경할 Weblogic domain 의 전체 server 를 shutdown
- ${DOMAIN_HOME}/security/DefaultAuthenticatorInit.ldift 파일을 Backup
- ${DOMAIN_HOME}/boot.properties 파일을 열어서 수정하고 없으면 새로 생성
[파일내용]
username=weblogic
password=[변경 password] - ${DOMAIN_HOME}/servers 디렉토리를 servers.org 로 이름을 변경
- ${DOMAIN_HOME}/bin/setDomainEnv.sh 를 실행
- 쉘에서,
$$> java weblogic.security.utils.AdminAccount weblogic [변경 password] .
를 실행 - 5에서 생성된 DefaultAuthenticatorInit.ldift 파일을 ${DOMAIN_HOME}/security/ 로 copy
- Admin server 를 기동하여 결과 확인
ssh 로그인 없이 자동 접속
A 라는 서버에서 B 라는 서버로 SSH 접속을 시도할 때 암호 입력 없이 바로 접속되는 방법
- A 서버에 ssh 접속
- $$> ssh-keygen -t rsa
passphrase 를 입력하라는 메시지가 나오면, 그냥 엔터(=null) 입력한다. - $$> ssh-copy-id -i ~/.ssh/id_rsa.pub {자동 접속할 B서버 계정}@{B서버IP 또는 도메인} 실행
- Password: 메시지가 나타나면 자동 접속할 계정의 암호를 평상시처럼 입력한다.
- 이후부터 ssh 접속 시 암호를 물어보지 않는다.
만약 이렇게 하였는데도 암호를 계속 물어본다면 B 서버의 sshd 의 설정 파일을 열어서 strict 라는 부분을 찾아서 false 로 고치도록 한다.
sshd 의 설정 파일은 OS 마다 다르지만 대게 /etc/sshd/sshd_config 파일이므로 vi 로 열어서 수정하면 된다.
이 방법은 보안상 매우 위험한 방법이므로, 외부와 확실히 단절된 LAN 내부 연결 호스트끼리만 사용하도록 한다.
MySQL com.mysql.jdbc.PacketTooBigException
- MySQL 을 사용하는 게시판에 첨부물 등을 upload 할 때, 첨부물 파일을 MySQL 내부에 저장하도록 설정이 되어 있으면 특정한 크기 이상의 첨부물을 등록할 때 Exception 이 발생한다.
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (11021370 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
- 그 원인은 MySQL 환경설정 중에 packet 최대치를 제한하는 옵션이 있기 때문인데 시동 옵션에 이를 명기하지 않으면 default=1MB 로 MySQL이 시동되기 때문에 이보다 더 큰 첨부파일은 MySQL 에 등록되지 않는다.
- MySQL 시동 옵션 중에 아래를 추가하도록 한다.
./mysqld_safe --user=mysql --max_allowed_packet=32M &
자바 Could not open jvm.cfg 에러 해결방법
Java 프로그램을 실행할 때 이런 에러를 만나게 되면 아래 순서대로 레지스트리를 편집하여 문제를 고칠 수 있게 된다.
- regedit 레지스트리 편집 프로그램을 연다.
- HKLM/SOFTWARE/Javasoft/JavaRuntimeEnvironment 이란 key 를 찾아간다.
- Key 의 내용 중 CurrentVersion 을 찾아 더블클릭한다.
- CurrentVersion 의 내용에 있는 디렉토리가 실제로 내가 원하는 Java 가 설치된 디렉토리인지 확인하여 수정한다.
이 에러메시지가 발생하는 원인은, 이전에 설치된 JVM 의 레지스트리 내용이 프로그램 삭제 때 그대로 남아 있어서 그렇다.
Amazon EC2 환경의 디플로이 자동화 아이디어
- 전제
- 동작
- 장점
- 생각
tail 명령의 위험성
Web Application Server 를 구동할 때 에러가 발생하는 것을 사전에 탐지하기 위하여, WAS 구동 script 에 log 를 확인하기 위한 UNIX shell tail 명령어를 걸어두는 경우가 많다. 아래가 tail 명령을 사용한 WAS startup script 이다.
#!/bin/sh JAVA_OPTIONS=...... CLASS_PATH=...... nohup java -cp $CLASSPATH $JAVA_OPTIONS > waslog.out & tail -f waslog.out
이렇게 작성하면 Java 로 구동된 WAS 가 발생하는 모든 표준 출력이 화면으로 redirect 된다.
그런데, 이것은 대단히 위험한 script 작성 방법 일 수 있다. 큰 시스템 장애를 만들 수도 있다. 만약 개발자 또는 시스템 관리자가 WAS 구동 이후 log 를 tail 하고 있는 상태에서정상적인 UNIX 시스템 Logout 없이 Shell program 이 종료 되면 WAS 가 kill 될 수 있고, 운영 중인 시스템에 큰 데미지를 입힐 수 있다.
그 이유를 알기 위해서는 nohup 으로 WAS 를 구동할 때 일어나는 Process grouping 과 Shell process 의 child invoke 매커니즘을 이해해야 한다.
첫번째, nohup 명령의 동작 특성 대하여 알아보자.
nohup POSIX 명령어는 Process 가 HUP(=Hang up) Signal 을 무시하도록 만든다. 이 HUP Signal 은 사용자가 접속한 Session 의 Shell Process 가 통신을 종료할 때 자식 Process 들에게 전파된다. 그래서 UNIX Shell 에 접속한 상태에서 logout 하는 경우 그 Shell 이 실행했던 모든 Program 이 종료된다. nohup 으로 Process 를 실행하면 HUP Siganl 을 무시하기 때문에 사용자의 login 여부와 상관없이 시스템에서 계속 실행이 되는 것이다.
OS 마다 다르긴 한데 nohup 으로 띄운 Process 는 자신을 실행한 Parent process 가 종료되면 사용자 Session 의 Shell process 의 자식으로 입양되었다가, Shell 이 종료되면 HUP Signal 을 받으면 일시적으로 Orphan process 가 되었다가 System Mothe shell process(=PID 1) 로 입양된다.
두번째, UNIX System 의 Process invocation 에 대하여 알아보자.
아래 그림은 UNIX System 에 접속한 상태에서 WAS 가 구동될 때 Process 의 가계도이다.
nohup Process 가 WAS 프로그램이다. 앞에서 보았듯이 Startup shell script process 가 종료되면 User shell process 로 WAS process 가 입양된다. 그러나 parent 가 종료되지 않으면 계속해서 Shell script process 의 자식으로 남아있게 된다.
tail 명령은 Shell script process 의 Child process 로 구동되는데, 이 녀석은 무한루프를 돌면서 stdout 을 가로챌 준비를 한다. 그러므로 Shell script process 는 자식이 작업을 마치길 기다리느라 종료되지 않는다.
이 상황에서 HUP Signal 이 발생하면 User shell 이 HUP Signal 을 접수하여 자식들에게 HUP 을 전파한다. 그런데 Shell script process 는 HUP 을 전파하지 않고 자신이 종료되어야 하기 때문에 아직 살아있는 Child process 에게 Kill Signal 을 전파하게 된다.
그 결과로 tail 뿐만 아니라 WAS Process 도 HUP 이 아니라 Kill signal 을 받아 죽게 된다.
truss -t\!all -sall -Sall -f ./startWAS.sh >& trusslog.log &
위 명령어는 startWAS.sh 를 실행하였을 때 받게되는 모든 OS Signal 을 trusslog.log 에 저장하는 명령인데 실제로 tail 이 포함된 shell process 가 어떤 OS Signal 을 받는지 기록해보면 tail 명령의 위험성을 더 잘 알 수 있을 것이다. 그리고 HUP Signal 을 고의로 발생시키려면 tail 이 되고 있을 때, Shell program 을 강제종료 시키면 된다.
tail 명령은 WAS 구동 관련 script 에 절대로 있어서는 안 된다. 따로 로그 확인을 위한 script 를 작성하는 것이 좋다.
피드 구독하기:
글 (Atom)