분류 전체보기 (199)
ººº::Development™:: (66)
ººº::Learning™:: (31)
ººº::Information™:: (37)
ººº::Note™:: (11)
ººº::Photo™:: (50)
ººº::zEtc™:: (3)
rss

믹시
tistory 티스토리 가입하기!
2007. 4. 3. 09:35
이번 프로젝트를 진행하면서 클라이언트에 설치되는 Agent를 만들었다.
이 Agent는 설치된 컴퓨터의 상태 정보(CPU 사용률, 메모리 사용률)를 모니터링 서비로 전달해주는 역활을 해주는 Java 프로그램이다.

모든 프로젝트가 끝나가는 지금 이 Agent를 어떻게 배포할지가 문제가 되었다.
Unix/Linux같은 경우는 스크립트 하나를 작성하거나 부팅 시에 백그라운드로 Agent를 실행시켜 주면 되지만 윈도우의 경우는 서비스에 등록을 시켜줘야만 한다는 것이다.
즉, 단순하게 [java 클래스명] 으로 Agent를 실행시켜 줄 수 있지만 이는 엄청난 노가다를 수반할 수 있다.

머 서버라는 것이 한번 부팅되고 모든 서비스가 올라오게 되면 거의 꺼지지 않고 작동을 한다고는 하나 혹시 서버의 특정 작업을 할경우나 다른 여타의 상황으로 인해 서버가 리부팅되었을 경우 관리자는 매번 Agent를 실행 시켜줘야 하는 문제점이 있다.

물론 이는 여타 다른 서비스들도 마찮가지지만 매번 윈도우 터미널을 연결해 Agent를 실행시켜주는건 너무 노가다라는 생각이 들었다.

그래서 Agent를 실행시켜 주는 batch파일을 만들고 이 배치 파일을 NT서비스에 등록해 서버가 리부팅 되었을 시에도 항상 실행되도록 하고자 했다. 이에 인터넷을 이리저리 뒤져보니 SC라는 것이 있네~~이걸 활용해 Agent를 NT서비스에 등록하는 법을 배우게 되었다.

서론이 좀 길었다. 그럼 지금부터 SC에 대해 알아보도록 하겠다.

===========================================================================================

Subversion 1.4 시리즈 이후부터 가능한 것으로 sc.exe(이하 SC) 유틸리티가 필요하다. SC는 Visual Studio .NET / Visual Studio 2005를 설치하거나 Windows SDK 최신 버전을 설치하면 자동으로 포함된다.

이러한 SC 유틸리티는 Windows NT 서비스에 관한 운영체제의 API를 커맨드 라인 유틸리티의 형식으로 직접 노출한 것으로 매우 다양한 옵션을 제공한다고 한다.( 나두 여기저기서 본거라 잘 모르지만 하여튼 그렇다고 한다. ) 그러나 마구잡이로 생각없이 사용하면 완벽한 해킹 도구가 될 수도 있다고 하니 잘들 사용하시기 바랍니다.

그럼 첫번째로 SC를 이용한 서비스 등록에 대해 상처보장!!

sc create [Program ID방식의 Service name] binpath="서비스로 실행할 파일의 풀 경로 / 만약 매게변수가 있다면 함께" displayname="서비스 관리자 애플릿에 표시할 이름" depend="다른 관련 서비스의 ID" start="시작형태" obj="서비스 시작에 사용한 Windows NT 계정 이름"

머 이리저리 옵션이 많이 있지만, 서비스 등록을 위해 필요한 것들이나 주의를 길울여 살펴봐야 한다. 여기서 한가지 SC의 명령줄 옵션은 문법이 까다롭다고 한다. 등호 다음에 오는 공백은 SC가 나름의 구문 분석 규칙을 정의해 놓은 것으로 이해하고 따라해야 한다. 즉, SC는 스위치 이름을 binpath, displayname과 같이 인식하기 보다는 binpath=, displayname= 까지 인식한다고 보는것이 정확하다. 즉 binpath= 이후 공백이 하나 존재해야 하는 것이다.

그럼 sc명령어와 옵션을 하나하나 살펴 보자
1. sc create 다음에 오는 필수 인자가 [Program ID방식을 Service name]
    : 여기에는 영문만을 사용하는것을 권장하며 윈도우가 그렇듯 영문 대/소문자는 구분하지 않는다.

2. binpath 옵션
    : 서비스로 실행할 파일의 경로와 해당 파일에 전달되는 인수를 한꺼번에 지정한다. 파일 경로 상에 공백이 포함되면 따옴표로 묶는다는 것은 기본 상식이다. 만약 이렇게 한번 따옴표를 쓰고나면 인수에는 따옴표를 전달할 수 없는게 아니냐는 고민에 빠지기 쉬운데 그런 고민은 할 필요없다. 신경쓰지 말고 필요한 만큼 따옴표를 쓰면 된다. 머 정 쓰기 싫으면 공백없이 경로를 잡고 프로그램을 설치하면 될 것이다.

3. displayname 옵션
   : 서비스 관리자 애플릿(services.msc)에서 표시할 이름을 의미한다. 서비스 관리자에서 알아볼 수 있는 편리한 이름을 정해서 기입하면 되며 한글을 사용해도 무방하다.

4. depend 옵션
    : 동록하고자 하는 서비스를 실행하기 위하여 필요한 다른 서비스의 ID를 써주는 곳이다. 여러개의 서비스에 종속되어있다면 "/" 기호를 써서 구분해주면 된다.

5. start 옵션
    : 등록하고자 하는 서비스를 언제 실행할 것인가에 대한 사항을 적은 곳이다. 보통 auto, demand, boot, system, disabled 중 하나는 선택한다. auto는 시스템 서비스가 모두 시작되었으며 아직 로그인은 하지 않은 상태에서 실행하는 것을 말하며, demand는 어떤 형태로든 시스템에 대한 사용 권한을 얻은 이후에 직접 구동하는 것( 사용자가 아닌 프로그렘에 의한것도 포함 )을 의미힌다. boot와 system은 주로 장치 드라이버와 연관된 서비스나 운영 체제 핵심 서비스에만 한정되는 내용이고 disabled는 거의 쓸 일이 없으며 이름 그대로 "사용하지 않도록 등록"한다는 의미이다.

6. obj 옵션
   : 이 서비스를 실행할 사용자 계정을 지정하는 곳이다. 대개 서비스를 등록하는 것은 특정 사용자와는 무관하게 독립적으로 실행되기 위한 것이므로 "NT AUTHORITY\LocalService"를 지정하면 적당하다. 하지만 직접 계정을 지정한다면 password 옵션을 써서 비밀번호를 따로 지정해야 한다.

그럼 위의 설명에 따라 Agent를 실행시키는 batch파일인 AgentStart.bat를 서비스에 등록하려면 다음과 같이 명령을 내리면 된다.

sc create RTCAgent
        binpath= "D:\Eclipse_Work\MySingleRTC\agent\Window\AgentStart.bat"  
        displayName= "RTCAgent" start= auto obj= "NT AUTHORITY\LocalService"

이렇게 등록하고 서비스 관리자에서 시작하면 된다.

자 그럼 등록을 했으면 삭제하는것도 봐야 되지 않을까?
서비스 삭제는 sc delete로 간단하게 된다.

sc delete [Program ID방식의 Service Name]

어떼 아주 간단하지 않을가?
여기서 사용되는 [Program ID방식의 Service Name]은 sc create를 이용해 서비스 등록할 때 사용했던 [Service Name]을 사용하면 된다. 몬든 삭제가 그렇듯 서비스 삭제에 있어서도 단 사용되는 [Program ID방식의 Service ID]는 윈도우 핵심 서비스일 수 있으니 삭제할 때는 각별한 유의가 필요하다.

마지막으로 등록된 서비스를 시작하는 것을 보도록 하자
서비스 시작 역시 서비스 삭제 만큼이나 간단하게 sc start로 되어있다.

sc start [Program ID방식의 Service Name]

이것역시 너무나 간단하지 않을가?
이쯤 되면 이곳에서 사용되는 [Program ID빙삭의 Service name]이 무엇인지는 굿이 설명하지 않아도 알것이다.


위 내용은 http://www.darkfox.info/1319 내용을 바탕으로 추가 작성되었습니다.

'ººº::Development™:: > ::zEtc™::' 카테고리의 다른 글

[ActiveX] ActiveX 배표파일 만들기( Cab파일 )  (0) 2008.04.17
RadRails 환경 설정 방법  (0) 2007.05.01
KDBC 2006 제출 논문  (0) 2007.03.22
chartFX by 한국 Sofrware FX  (0) 2007.03.22
SSh 라네...  (0) 2007.03.22