자바를 이용하여 어처구니 없는 프로그램을 하나 만들고 있습니다. 솔라리스에서 데몬형태로동작을 시켜야
하는데, 자바는 SIGNAL 처리가 되지 않는다고 합니다. ( 되나? 잘 모르겠습니다. ) 따라서, C 로 제작된 프로그램
처럼 데몬이 될 수 없다고 하여 결국 [nohup 과 & ] 를 이용하여 백그라운드로 동작을 하게 했는데
오늘 한 친구가 아래의 글에서 담고 있는 jakarta commons
daemon을 알려 주었습니다. 일전에 한번인가 본적이
있는데, 컴파일을 해야 되고, 뭐도 해야 되고 , 뭐도 해야 되고 해서 복잡해서 포기 했다가, 다시 찾게 되었습니다.
아래의 글을 네이버를 검색 하다 찾은 블로그 글 입니다. 부디 많은 자바 인력들에게 도움이 될 수 있길 바랍니다.
자카르타의 부단한 노력은 저를 이롭게 하고 있습니다. 추가로, 아래를 쓰지 않고, JNI 를 이용하여 시그널
처리를 함으로써 처리도 가능 하다고 합니다. 하지만, 전 능력의 부재로 인해 범접하지 못 하고 있습니다.
서버 소켓을 하나 열어 놓고 소켓으로 중지 메시지가 들어 오면 데몬이 중지되게 구현한다고 하는데(아파치 톰캣이나 resin이 이렇게 구현된 것
같다) 구현 자체가 좀 귀찮기도 하고, 소켓을 사용하니 보안상 문제도 있는 것 같고(물론 localhost에서만 접속을 허용하면 되긴 하지만),
무엇보다 유닉스 적이지 않은 것 같아 찝찝한 감이 있다. 보통 유닉스 데몬들은 TERM 시그널(signal)을 보내서 데몬을 중지하게끔 구현되어
있으므로 자바로 작성한 데몬도 이렇게 작동시킬 수 있으면 좋을 것이다.
자바에는 유닉스의 시그널 처리에 관한 지원이 없다. 따라서
천상 자바에서 시그널 처리를 하려면 jni를 이용하여 c로 시그널을 받는 부분을 만들고 이 부분에서 등록된 자바 코드를 실행시킬 수 있도록 해야
한다. 꽤나 만만치 않은 작업인데 단지 TERM 시그널을 처리하기 위해 작업하기엔 너무 손이 많이 간다는 생각이 들 수
있다.
jakarta 프로젝트의 하위 프로젝트로 진행되고 있는 commons-daemon 프로젝트(http://jakarta.apache.org/commons/daemon/)는 이 부분을 구현한
것이다. 원래 tomcat 프로젝트에서 tomcat을 기동시키는데 쓰기 위해 만들어졌다가 독립 프로젝트로 분리되어 나왔다고
한다.
commons-daemon은 c로 만들어진 운영 체제 종속적인 부분과 자바 클래스로 구성되어 있다. 운영 체제 종속적인
부분은 유닉스를 지원하는 jsvc와 윈도우즈를 지원하는 procrun으로 구성되어 있다. 윈도우즈 쪽은 잘 모르겠고, 유닉스를 지원하는
jsvc는 jvm을 기동시키고 인자로 들어온 클래스의 메소드를 차례로 실행시킨다. 프로세스를 터미널에서 detach시키고 사용자를 바꾸는 일도
한다. 그리고 TERM 시그널을 받으면 미리 지정된 메소드를 실행시키고 jvm을 셧다운시키는 작동을 한다. 데몬을 만드는 데 필요한 기본적인
일을 하는 셈이다.
commons-daemon을 이용하여 데몬을 만드려면 org.apache.commons.daemon.Daemon
인터페이스를 구현하는 클래스를 만들면 된다. 이 클래스가 데몬의 기본 동작을 한다. init, start, stop, destroy 메소드를
구현해야 하는데 init, start는기동될 때 차례로 호출되고, 셧다운 신호가 오면(TERM signal) stop, destroy 메소드가
차례로 호출된다.
init, start, stop, destroy는 모두 같은 스레드에서 작동되므로 start 메소드가 호출되어
return 되어야만 데몬이 완전히 실행되어 시그널 처리를 제대로 할 수 있다. 따라서 데몬이 호출을 기다리며 무한 루프에 들어가는 부분은
start 메소드에서 별도의 스레드를 생성하여 처리해야 한다. 이것만 주의하면 이용 상 어려움 점은 없다.
배포와 실행에 약간
주의해야 할 점이 있는데 클래스 파일과 실행 파일의 소유자와 퍼미션 등을 실행할 유저에 맞춰서 잘 조정해야 한다. 실행한 유저가 클래스 파일을
읽을 수 있어야 하는데, 이는 jsvc를 다른 유저로 실행시키고자 할 때 조심해야 할 사항이다.
HUP 시그널도 처리할 수 있으면
좋았을 것 같다는 생각도 들지만(reload 메소드가 있는 걸로 봐서 추후 구현할 모양이다) 어쨌든 간편히 데몬을 만들 때 쓰기 좋은
패키지이다. 좋은 프로젝트를 진행하는 프로젝트 팀원들에게 감사를!