2014-05-08 21 views
7

Tôi đang sử dụng mẫu được tìm thấy tại đây: Is it possible to run a Python script as a service in Windows? If possible, how?Triển khai ứng dụng Flask dưới dạng dịch vụ windows

Đây là run.py mà tôi đã cài đặt làm dịch vụ theo hướng dẫn trong liên kết ở trên.

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask App" 

    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): 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 
     self.main() 

    def main(self): 
     app.run(host = '192.168.1.6') 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(AppServerSvc) 

Tuy nhiên, khi tôi cố gắng để bắt đầu dịch vụ i nhận được thông báo:

"Các dịch vụ Flask App trên Local Computer bắt đầu và sau đó dừng lại Một số dịch vụ tự động dừng nếu họ không được sử dụng bởi. các dịch vụ hoặc chương trình khác. "

Bất kỳ ý tưởng nào tôi đang làm sai? Tôi đã thử nhiều tài khoản người dùng khác nhau - tôi không nghĩ đó là vấn đề về quyền.

Cảm ơn!

Trả lời

5

Tôi không thể truy cập WSGIRequestHandler trong Flask bên ngoài request, vì vậy tôi sử dụng Process.

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
from multiprocessing import Process 

from app import app 


class Service(win32serviceutil.ServiceFramework): 
    _svc_name_ = "TestService" 
    _svc_display_name_ = "Test Service" 
    _svc_description_ = "Tests Python service framework by receiving and echoing messages over a named pipe" 

    def __init__(self, *args): 
     super().__init__(*args) 

    def SvcStop(self): 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 
     self.process.terminate() 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

    def SvcDoRun(self): 
     self.process = Process(target=self.main) 
     self.process.start() 
     self.process.run() 

    def main(self): 
     app.run() 


if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(Service) 
+0

Cảm ơn bạn đã lấy mẫu mã! Tôi đã sử dụng thành công nó để _deploy_ trên máy chủ windows. Tuy nhiên tôi đã nhận được ** Lỗi máy chủ nội bộ ** và chỉ có thể giải quyết bằng 'os.chdir (os.path.dirname (os.path.realpath (__ file__))) ' - vấn đề là sau đây, tập lệnh đã được chạy từ một số thư mục 'win32' (như dịch vụ), do đó, tải bất kỳ tập tin (mong đợi là trong' dir' của kịch bản) gây ra một lỗi. – quapka

2

Đã tìm ra - tôi đã để lại tùy chọn gỡ lỗi trên trong app.run(). Một khi tôi gỡ bỏ nó, nó là tốt để đi!

Trong khi dịch vụ bắt đầu và chạy chính xác (tôi có thể truy cập vào ứng dụng bình của mình từ một máy tính khác trên mạng), nó không thể dừng lại. Trong chuỗi có mẫu được đăng mà tôi đã sử dụng, tác giả đề cập đến điều gì đó về việc đặt cờ để dừng dịch vụ đúng cách.

Bất kỳ ai biết điều này có ý nghĩa gì và cách mã hóa để dừng dịch vụ đúng cách?

-3

Tôi nối mã của tôi vào SvcStop() dòng cuối cùng. "self.ReportServiceStatus (win32service.SERVICE_STOPPED)"

Trong trường hợp của tôi, Nó hoạt động để dừng dịch vụ.

from app import app 

import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "Flask App" 
    _svc_display_name_ = "Flask App" 

    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) 
     # !important! to report "SERVICE_STOPPED" 
     self.ReportServiceStatus(win32service.SERVICE_STOPPED) 

    def SvcDoRun(self): 
     servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, 
           servicemanager.PYS_SERVICE_STARTED, 
           (self._svc_name_,'')) 
     self.main() 

    def main(self): 
     app.run(host = '192.168.1.6') 

if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(AppServerSvc) 
Các vấn đề liên quan