Microsoft/Windows

윈도우 서비스 등록

구차니 2025. 2. 18. 12:01

심심해서(?) go로 작성한 echo 서버를 크로스빌드하고 서비스 등록했는데

"시작중"이 뜨다가 "종료됨"으로 떠버린다.

프로그램이 서비스로 작동하기 위해서는 일반적인 프로그램을 실행하면 안되는건가 싶기도 한데..

 

빌드는 아래와 같이 하고

$ go mod ninit
$ go mod init echo
$ go mod tidy
$ GOOS=windows go build

[링크 : https://github.com/venilnoronha/tcp-echo-server]

[링크 : https://dadev.tistory.com/entry/GO-Windows-macOS-및-Linux용-Go-프로그램을-교차-컴파일하는-방법]

 

한번 그냥 실행해서 방화벽 예외 추가해주고, 관리자 권한의 콘솔에서 아래와 같이 입력해주면 끝

C:\Windows\system32>sc create "echo service" binPath= "c:\echo\echo.exe 9000 hello"
[SC] CreateService 성공

C:\Windows\system32>sc delete "echo service"
[SC] DeleteService 성공

[링크 : https://blog.naver.com/battle50/220311915822]

 

특이하게도 옵션 이름에 =가 붙어야 해서 =" 하면 안된다.

C:\Windows\system32>sc create "echo service" binPath ="c:\echo\echo.exe 9000 hello"
설명:
        레지스트리 및 서비스 데이터베이스에 서비스 항목을 만듭니다.
사용법:
        sc <서버>create [서비스 이름] [binPath= ] <옵션1> <옵션2>...

옵션:
참고: 옵션 이름은 등호(=)를 포함합니다.
      등호와 값 사이에는 공백이 한 칸 있어야 합니다.
 type= <own|share|interact|kernel|filesys|rec|userown|usershare>
       (default = own)
 start= <boot|system|auto|demand|disabled|delayed-auto>
       (default = demand)
 error= <normal|severe|critical|ignore>
       (default = normal)
 binPath= <.exe 파일에 대한 BinaryPathName>
 group= <LoadOrderGroup>
 tag= <yes|no>
 depend= <종속성(슬래시(/)로 구분)>
 obj= <AccountName|ObjectName>
       (default = LocalSystem)
 DisplayName= <표시 이름>
 password= <암호>

 

테스트는 리눅스에서 아래와 같이 테스트 하면 끝. telnet에서 ctrl-c,d,z를 다 패스시키니

ctrl-[ 를 이용해서 메뉴로 나와 종료해야 한다.

$ telnet 192.168.220.253 9000
Trying 192.168.220.253...
Connected to 192.168.220.253.
Escape character is '^]'.

hello 
d
hello d
^]
telnet> quit
Connection closed.

[링크 : https://superuser.com/questions/486496/how-do-i-exit-telnet]