2011-10-28 35 views
2

我已經使用this question來學習如何使用ActivePython將我的python腳本安裝爲服務。我能夠安裝我的腳本並將其刪除,正如我所期望的那樣,但是我的問題是,一旦我啓動腳本運行,我就失去了停止或刪除腳本的能力。它只是永久運行,我無法擺脫它。鏈接問題的答案提到檢查標誌以停止腳本。有人可以解釋如何做到這一點?將python腳本作爲服務運行的問題

現在這個腳本做的很少。每隔幾秒只打印一行文件。在繼續研究更復雜的事情之前,我想讓它工作。

import pythoncom 
import win32serviceutil 
import win32service 
import win32event 
import servicemanager 
import socket 
import time 


class AppServerSvc (win32serviceutil.ServiceFramework): 
    _svc_name_ = "PythonTest" 
    _svc_display_name_ = "Python Test" 
    _svc_description_ = "This is a test of installing Python services" 

    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): 
     i=0 
     while True: 
      f=open("C:\\hello.txt","a") 
      f.write("hello"+str(i)+"\n") 
      f.close() 
      i=i+1 
      time.sleep(5) 


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

我可能會建議[此ActiveState配方](http://code.activestate.com/recipes/551780/)大大簡化了編寫簡單的Windows服務。 – ig0774

回答

5

當然,你無法阻止它,你陷入了一個無限循環。替換:

time.sleep(5) 

與此:

if win32event.WaitForSingleObject(self.hWaitStop, 5000) == win32event.WAIT_OBJECT_0: 
    break 

應該做的伎倆。

+0

謝謝。這工作。任何想法如何擺脫我解決之前安裝的服務? – ewok

+0

如果您編輯腳本並重新啓動新代碼應接管的服務。如果您正在討論以前版本的實例,只需啓動任務管理器(Ctrl + Shift + Escape)並殺死相關進程;他們應該以您的腳本命名。或者重新啓動:) – fraca7

+0

雖然我在這裏,更詳細的解釋:SvcDoRun方法實際上是在一個線程中運行,該線程與調用__init__的線程是分開的。當服務管理器調用SvcStop時,它仍然在另一個線程中。因此,您必須在SvcStop中設置事件,並檢查它是否在SvcDoRun中設置,以便在Windows告訴您時退出該線程。 – fraca7

0

「檢查一個標誌」意味着讓腳本(在True循環中)查找某個東西,幾乎任何東西,作爲跳出循環的信號。它可以檢查具有特定名稱的文件的存在並在文件創建時退出。只要您可以手動或通過控制應用程序創建信號,該服務就可以查找相同的信號。

至於「無法阻止它」,你的意思是說即使你試圖用Windows任務管理器殺死它,它也會繼續運行嗎?

+0

據推測,@ewok意味着服務無法使用服務控制面板或「網絡停止」停止,因爲無限循環,服務將繼續運行。 – ig0774

+0

@ ig0774是正確的 – ewok

相關問題