Apache Commons Daemon 사용 방법 정리
Java 로 Daemon Process 를 만들기 위해 Apache Commons Daemon 라이브러리를 알아보고 사용 방법을 정리하였습니다
(Win32 / *NIX 가 사용하는 모듈이 다른데 이 문서에서는 *NIX 기준으로 정리했습니다)
Apache Commons Daemon
- 메인 페이지 : http://commons.apache.org/proper/commons-daemon/
- Tomcat 이 Daemon Process 로 동작하기 위해 내부적으로 사용하는 라이브러리
- 2개의 파트로 나뉘어진다
- OS dependent 한 작업(Daemonize, 기타 등등)들을 수행하는 모듈 : C 로 구현
- Daemon API : Java 로 구현
- Platform 지원
- Win32 : procrun
- *NIX : jsvc
- 최신 버전 : 1.0.17
- Maven Central 에는 1.0.15 까지 올라와 있다
설치
Maven
<dependency>
<groupId>commons-daemon</groupId>
<artifactId>commons-daemon</artifactId>
<version>1.0.15</version>
</dependency>
JSVC
- 메인 페이지 : http://commons.apache.org/proper/commons-daemon/jsvc.html
- 설치 전 필요한 것들
- GNU AutoConf (at least version 2.53)
- An ANSI-C compliant compiler (GCC is good)
- GNU Make
- A Java Platform 2 compliant SDK
mkdir -p jsvc
cd jsvc
wget http://apache.mirror.cdnetworks.com/commons/daemon/source/commons-daemon-1.0.15-src.tar.gz
tar xvfz commons-daemon-1.0.15-src.tar.gz
cd commons-daemon-1.0.15-src
cd src/native/unix/
sh support/buildconf.sh
./configure –with-java=/usr/java
make
sudo cp jsvc /usr/bin
- support/buildconf.sh 실행 시 아래처럼 나타나야 함
-
support/buildconf.sh: configure script generated successfully
-
- OSX 10.8 / Java 1.6 사용 시 configure 는 아래와 같이 실행한다
-
./configure –with-java=/System/Library/Frameworks/JavaVM.framework/Versions/Current
- JDK 경로에 맞게 실행하면 jni*.h 파일을 찾을 수 없다고 나옴
-
구현
- org.apache.commons.Daemon 인터페이스를 구현하는 클래스를 만든다
- Daemon 인터페이스 명세
-
package org.apache.commons.daemon;
public interface Daemon
{
public void init(DaemonContext context) throws DaemonInitException, Exception;
public void start() throws Exception;
public void stop() throws Exception;
public void destroy();
}
-
- 메소드 설명
- init() : Daemon 과 모듈에 대한 초기화를 담당
- context.getArguments() 로 실행 전달인자(String[] args) 를 얻을 수 있다
- start() : 모듈을 실제로 실행
- stop() : 외부 시그널이 들어왔을 때 호출되는 메소드, 동작하는 모듈을 멈춤
- destroy() : stop() 호출 후, JVM 종료 전에 호출, 자원 해제 담당
- init() : Daemon 과 모듈에 대한 초기화를 담당
- 정상적으로 stop() 이 호출되려면, start() 에서 실제로 동작할 모듈을 Thread 로 띄우고 stop() 에서 Thread 를 멈추게 한 다음, 해당 Thread 를 join 하도록 구현한다
- Thread 를 새로 띄우지 않고 start() 에서 Thread 제어권을 가져가버리면 외부에서 종료 시그널이 들어왔을 때 stop() 이 호출되지 않고 비정상 종료된다
- init() 과 destroy() 가 짝이 되고, start() 와 stop() 이 짝이 된다
- 자원 할당 및 해제도 짝에 맞춰 수행하면 됨
실행
실행 방법
jsvc [JSVC params] [Entry Point Class] [Arguments]
- 파라미터
- -outfile : stdout 을 받을 파일명 (기본값 : /dev/null)
- -errfile : stderr 를 받을 파일명 (기본값 : /dev/null)
- -pidfile : PID 가 저장될 파일 경로 (종료시 활용)
- -cp : JVM 에 전달될 classpath (Apache Commons Daemon 이 포함되어 있어야 함)
- OSX 에서 실행 시 주의사항
- jsvc 실행하기 전에 arch 로 JVM 의 bit 를 명시해야 함
- 32bit : arch -arch i386
- 64bit : arch -arch x86_64
- JSVC params 에 -jvm server 를 추가해야 함
- jsvc 실행하기 전에 arch 로 JVM 의 bit 를 명시해야 함
종료 방법
jsvc -stop -pidfile PID_FILE_PATH [Entry Point Class]
답글 남기기