Python 프로그램을 윈도우 서비스 실행 및 EC2 데몬 실행

2018. 10. 2. 15:14서버 프로그래밍

파이선으로 만든 프로그램을 윈도 서비스로 만들어서 항상 실행되게 하려고 했는데... 뭐가 이리도 복잡한지 원.

한참을 괜찮은 레퍼런스 찾다가 결국 이것을 찾았다. 레퍼런스란 이렇게 만드는 것이다!!

깔끔한 README 파일과 예제 샘플 하나... 정말 핵심만 정리 잘해놓았다.

https://gist.github.com/guillaumevincent/d8d94a0a44a7ec13def7f96bfb713d3f


Build

(env)$ pyinstaller -F --hidden-import=win32timezone WindowsService.py

Run

(env) dist\WindowsService.exe install
Installing service TestService
Service installed

(env) dist\WindowsService.exe start
Starting service TestService

Clean

(env) dist\WindowsService.exe stop
(env) dist\WindowsService.exe remove


import servicemanager

import socket
import sys
import win32event
import win32service
import win32serviceutil
class TestService(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
rc = None
while rc != win32event.WAIT_OBJECT_0:
with open('C:\\TestService.log', 'a') as f:
f.write('test service running...\n')
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(TestService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(TestService)


윈도 10에서 명령 프롬프트로 서비스 등록을 하려면 다음과 같은 오류 메시지가 뜬다.

Error installing service: Access is denied. (5)

이것은 그냥 관리자 권한이 없어서이므로 관리자 모드로 명령 프롬프트를 실행하고 다시 시도하면 해결된다.


error 1053 the service did not respond to the start or control request in a timely fashion

이렇게 뜨는 경우에는 중간에 뭔가 에러나 난 것이다.

내 경우에는 대부분 상대 경로로 되어 있는 conf, json, log 파일들의 경로를 절대 경로로 바꿔서 해결했다.


http://www.engear.net/wp/python%EC%9C%BC%EB%A1%9C-windows-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0/


뭔가 도움이 될것 같이 보였으나 별로 도움이 안되는 내용들...

http://bluesid.tistory.com/229

http://pydjango.tistory.com/entry/CODE-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9C%88%EB%8F%84%EC%9A%B0-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%93%B1%EB%A1%9D


----------------


그리고, 파이선으로 만든 서버 프로그램을 AWS EC2에서 계속 실행되도록 하려면 다음과 같이 하면 된다.

http://tbang.tistory.com/54

데몬 처럼 실행

$ nohup python3 manage.py runserver 0.0.0.0:8000 &


실행 데몬들을 확인해보면 

$ ps -l


다음과 같은 데몬들이 보인다.

0 S  1000 20847 20259  5  80   0 - 23755 wait   pts/0    00:00:00 python3

0 S  1000 20849 20847  6  80   0 - 43989 poll_s pts/0    00:00:00 python3

터미널 접속이 끊긴 후에도 여전히 접속된다면 성공.


데몬을 종료시키려면 다음 명령을 실행한다.

$ kill -9 [PID]


http://studymake.tistory.com/620


프로세스 목록 확인

ps 명령어로 프로세스의 목록을 확인할 수 있다.

~$ ps


아무런 옵션을 주지 않으면 현재 터미널에 관련된 프로세스들의 간략한 정보를 보여준다.  좀 더 자세한 정보를 알고 싶다면 -f 를 붙인다.

~$ ps -f



시스템의 모든 프로세스 리스트를 보고 싶다면 -e 옵션을 주면 된다.

~$ ps -e

~$ ps -ef