자바로 안드로이드 통신을 위한 소켓서버를 만들었는데, 자바의 특성상 윈도우 서버를 사용하는 경우 지정된 사용자로 자동로그인이 되어야 시작프로그램에 등록된 중계서버가 정상적으로 작동하였습니다.
가끔! 서버관리자가 이를 잊어버리고 최종 작업에서 지정된 사용자로 로그인을 하지 않으면 중계서버는 무용지물이 되는 것이지요. 이를 방지하기 위해서 윈도우 서비스로 등록하여 로그인을 하지 않더라도 정상적으로 중계서버가 작동하는 것을 목적으로 합니다.
구글링에서 검색되는 수많은 방법중에 저에게 가장 간편하고 잘 동작하는 것을 골랐습니다. 물론 저도 윈도우 2008 R2 서버에서 정상적으로 사용하고 있는 방법입니다.
구현 방법은 간단합니다. 대부분의 자바 프로그램은 jar 파일로 배포를 하게 됩니다. executable jar 파일로 배포가 된 파일을 기준으로 하고 있습니다. 여기까지는 다른 글을 확인하시고 오시기 바랍니다.
일단 생성된 jar 파일은 test_server.jar 라고 합시다. 그럴때 다음과 같은 커맨드로 정상적으로 작동하는 것을 기준으로 합니다. 이 작업이 안되면 executable jar 파일 생성부터 다시 하고 오시기 바랍니다.
c:\>java -server -jar test_server.jar
c 드라이브의 루트에 test_server.jar 파일이 있는 상태에서 위의 명령어로 정상적으로 작동이 되어야 합니다. executable jar 는 별도로 실행하는 최초 클래스명을 적어주지 않아도 정상적으로 작동하도록 되어 있습니다.
위와 같이 정상적으로 작동하게 된다면 이제는 jar 파일을 윈도우 서비스처럼 작동시켜주는 wrapper 를 구하러 갑니다.
저는 JavaService.exe 등등 5-6가지를 적용해봤는데 이렇다하게 간단하고 저에게 딱맞는 기능을 제공하는 wrapper 는 the Non-Sucking Service Manager 였습니다. (이름 참 멋지구리합니다.)
해당 프로그램은 다음 URL에서 무료로 다운 받을 수 있고, 32비트 버전과 64비트 버전을 모두 제공하므로 글을 읽으시는 분들의 서버에 맞는 파일을 받으시면 되겠습니다.
홈페이지 : http://nssm.cc/
다운로드 : http://nssm.cc/download
글 쓴 날짜 기준으로 2.33 버전이 배포되고 있습니다.
프로그램을 받았다면 간단히 서비스에 등록하고, 서비스를 등록해제하는 방법 2가지만 정리하고 끝내겠습니다.
명령어는 커맨드창을 통해서 입력하게 되고,
1. 서비스를 생성하는 방법
위의 이미지에서 입력한 명령어를 해석하면, nssm.exe 는 우리가 다운받은 wrapper 프로그램이고, install 은 서비스를 등록하겠다는 명령어입니다. 그리고 test_server 는 시작버튼 -> 제어판 -> 관리도구 -> 서비스에서 보이는 서비스 명칭을 적은 것입니다.
위와 같이 실행을 하면 간단한 설정을 위한 작은 창이 뜨게 됩니다.
위의 이미지에 대한 설명을 해드리겠습니다. 우리는 jar 파일을 실행할 건데, jar 파일을 실행하는데 필요한 프로그램은 java.exe 입니다. 그렇죠? 그래서 첫번째 Path 항목에 jre 또는 jdk 의 java 파일을 찾아줍니다.
그리고 Startup directory 인데요. 저는 제가 실행할 jar 파일이 위치한 디렉토리를 선택하였습니다. (이부분은 사용자마다 다를 수 있겠지요?)
그리고 Arguments 입니다. 이건 java.exe 를 이용하여 jar 파일을 실행할 때와 동일한 파라메터를 그대로 옮겨 적은 것입니다. 저는 -server 와 -jar 라는 2개의 arguments만 사용하였습니다. -server는 서버설정을 기준으로 java.exe를 구동하도록 하는 것입니다. 기본적으로 저 명령어를 사용하지 않으면 -client로 실행하는 것과 같습니다. 물론 저의 프로그램은 서버역할을 하는 프로그램이므로 -server라는 arguments를 써 준 것입니다.
그리고 -jar 는 jar 파일을 실행하겠다는 것입니다. 보통은 클래스명을 지정하여 해당 클래스를 시작하게끔하는 경우도 있는데 executable jar는 그런 실행에 관련된 정보가 jar 파일의 manifest 에 저장되어있으므로 우리는 단순히 -jar arguments를 이용해서 실행하고 싶은 jar 파일만 연결해주면 됩니다.
중요한 내용은 위의 내용이 전부입니다. 이후부터는 그냥 참고만 하겠습니다.
Details 탭의 내용입니다. 크게 의미가 없는 부분이므로 저는 Display name 에 하단의 Service name과 동일하게 적어주었고, Description은 간단히 적어보았습니다. 여기서 중요한 것은 Startup type 인데요. 우리는 프로그램이 부팅만 하면 자동으로 항상 실행되기를 원하므로 automatic을 선택합니다.
Log on 탭입니다. 별다른 설정없이 우리가 원하는 서비스를 로컬 시스템 계정으로 실행하라고 지정합니다. 대부분의 윈도우 서비스가 저렇게 설정됩니다. 뒤의 체크박스가 의미하는 바는 모르겠습니다. 혹시 아시는 분이 계시면 코맨트 부탁드립니다. 별도의 계정을 사용한다면 This account 를 선택하고, 아이디와 패스워드를 입력해주면 됩니다.
Dependencies 항목입니다. 자바프로그램이 마땅히 윈도우 프로그램이나 콤포넌트를 사용하지 않으므로 저는 써준 내용이 없습니다.
Process 항목입니다. 프로세스의 우선순위와 CPU 사용개수를 지정할 수 있는데 위의 Default 값을 저는 그대로 두었습니다. 필요에 따라 수정하시면 될 것 입니다.
Shutdown 항목입니다. 저는 수정하지 않았았습니다.
Exit 옵션입니다. Default 그대로 입니다.
I/O에 관련된 항목입니다. 의미상으로 우리가 System.out.println 명령어를 사용하였다면 위의 항목중 Output(stdout)에 지정된 파일에 로그처럼 쓰기가 됩니다. 별도의 로그를 생성하고 싶다면 저곳에 각각의 로그파일에 해당하는 파일을 적어주시면 됩니다. 저는 Log4j를 사용하여 Log4j에 설정된 폴더에 로그가 생성되어 별도의 설정을 하지 않았습니다.
File rotation 항목입니다. 가만히 보면 종료시 output 파일이나 error 관련된 파일을 교체하도록 하고, 주기, 사이즈등을 설정할 수 있는데, 저는 Log4j를 사용하므로 무시했습니다.;;
물론 특별한 환경설정값도 필요없어서 아무것도 안써놓았습니다.
이렇게 모두 설정을 하고 install service 버튼을 누르면 서비스항목에 test_server 라는 항목이 생긴 것을 확인 할 수 있고, 자동으로 설정되어 있지만, 생성된 순간 작동하지는 않습니다. 리부팅을 하면 자동으로 실행되지만 서버인만큼 부팅없이 서비스를 구동하고 싶다면, 시작 -> 제어판 -> 관리도구-> 서비스에서 test_server라는 항목을 찾아서 실행하거나 커맨드 창에서
위와 같은 명령어를 이용해서 서비스를 구동할 수도 있습니다.
2. 등록된 서비스를 해제하는 방법
등록하는 것보다 훨씬 간단합니다.
일단 서비스를 중지시킵니다. 명령어는 다음과 같습니다.
이렇게 해서 프로그램이 중지되면 다음 명령어를 이용해서 서비스 등록을 해제합니다.
이렇게 명령어를 입력하면 확인 다이얼로그가 뜨고 YES를 누르면 해제됩니다.
확인하지 않고 바로 삭제하는 경우는 다음 명령어를 입력합니다.
이렇게하면 확인없이 바로 해제됩니다.
이렇게 jar 파일을 사용하여 윈도우 서비스 등록하기를 편리하게 사용해보시기 바랍니다. 끝.