[Python]用XYNTService把Python程式變為服務
-
1. XYNTService的使用
-
-
1.1. 介紹
-
1.2. XYNTService
-
2. 用XYNTService把Python程式變為服務
1. XYNTService的使用1.1. 介紹
通常,NT服務是控制台應用程式,它沒有訊息迴圈。不必等到使用者登陸電腦,NT服務便能啟動,並且在使用者登出之後,它也不會停止運行。然而,許多現存的ActiveX控制項很難,有時候根本不可能在控制台程式中使用。 可以用Windows程式的形式直接寫NT服務,但是XYNTService提供一個更簡單的解決方案。本文配套原始碼是一個簡單的NT服務程式,它能夠啟動和關閉其它作為服務的程式。所有需要做的是安裝這個服務,修改.ini檔案。下面是使用XYNTService的好處:
1.2. XYNTService
XYNTService.exe是此NT服務程式可執行檔的名字,可以在此下載。
預設情況下,在電腦重啟時,安裝的服務便會自動啟動。你也可以使用服務表徵圖從控制台啟動和關閉服務。服務啟動時,它將會一個挨一個地建立在XYNTService.ini檔案中定義的所有進程。服務關閉時,它將會終止這些進程(以相反順序)。XYNTService.ini檔案應該和可執行檔放在相同的目錄。下面是此檔案的一個例子。
[Settings]
ServiceName = XYNTService
ProcCount = 3
CheckProcess = 30
[Process0]
CommandLine = c:/MyDir/XYRoot.exe
WorkingDir = c:/MyDir
PauseStart = 1000
PauseEnd = 1000
UserInterface = Yes
Restart = Yes
[Process1]
CommandLine = c:/MyDir/XYDataManager.exe
WorkingDir = c:/MyDir
PauseStart = 1000
PauseEnd = 1000
UserInterface = Yes
Restart = Yes
[Process2]
CommandLine= java XYRoot.XYRoot XYRootJava.ini
UserInterface = No
Restart = No
ServiceName屬性指定想要為此NT服務使用的名字,預設名字為XYNTService。如果複製可執行檔和.int檔案到不同的目錄,在.int檔案中修改ServiceName屬性,即可安裝和配置一個不同的服務。
ProcCount屬性指定想要此服務建立的進程的數量。節[Process0]、[Process1]等定義了相關進程的屬性。如你所見,此例中要建立3個進程, XYRoot.exe,XYDataManager和java是程式的名稱,你可以為每個進程在CommandLine屬性指定參數。必須在CommandLine屬性為對應進程指定可執行檔的完整路徑,除非可執行檔在系統路徑。
CheckProcess屬性指定是否檢查XYNTService啟動的進程,也指定了檢查的頻率。如果此屬性的值為0,便不進行檢查。如果屬性的值為30,則每經30分鐘XYNTService將查詢作業系統以查看它啟動的進程是否還在運行,如果進程的Restart屬性值(後門解釋)定義為Yes,則將終止的重新啟動。此屬性的預設值(如果你沒有指定它)是60。
WorkingDir屬性是當前進程的工作目錄。如果你沒有指定此屬性,當前進程的工作目錄將會是X:/winnt/system32。PauseStart屬性是服務在啟動當前進程後將等待的時間(以毫秒為單位)。在下一個進程需要依靠前一個進程的情況下此選項非常有用。例如,第二個進程不得不串連到第一個進程以便在第一個進程完成初始化後它再運行。如果你沒有指定PauseStart屬性,預設值將是100毫秒。
當XYNTService關閉時,它將首先向它建立的進程投遞WM_QUIT訊息,然後調用Win32函數TerminateProcess。PauseEnd屬性是服務在調用TerminateProcess之前等待的時間(以毫秒為單位)。此屬性可以用來給進程清除和關閉的機會。如果你沒有指定PauseEnd屬性,預設值將是100毫秒。 UserInterface屬性控制一個登陸使用者是否能夠看到XYNTService建立的進程。然而,僅當XYNTService運行在本地系統帳戶下時才起作用,預設就是這樣的。在這種情況下,XYNTService建立的進程將不能訪問特定使用者的設定。你可以配置XYNTService運行在一個使用者帳戶下,在控制台中很容易做到這一點(雙擊服務表徵圖,然後在安裝的服務列表中雙擊XYNTService彈出配置對話方塊)。
Restart屬性用來決定你是否想要XYNTService重新啟動終止的進程。如果此屬性是No(這是預設值),那麼對應進程將不會被重啟。如果是Yes,那麼終止的進程將會被XYNTService重新啟動。啟動終止進程的頻率由上面的CheckProcess屬性指定。
你可以從命令列反彈(停止和重啟).int檔案中定義的任何進程。例如,如下命令: XYNTService -b 2 將停止和重新啟動.ini中[Process2]節定義的進程。 XYNTService也可以用來從命令列啟動和停止其它服務。下面是啟動(run)和停止(kill)其它服務的命令。 XYNTService -r NameOfServiceToRun XYNTService -k NameOfServiceToKill
特別的,你可以在命令列使用上面的命令啟動和停止XYNTService自身。請注意,你不能不帶參數啟動XYNTService。
運行XYNTService時出現的所有錯誤都將被寫入記錄檔,此檔案與可執行檔在相同目錄下。記錄檔中的出錯代碼是GetLastError API返回的十進位數字,可以在MSDN中查看詳細資料。
2. 用XYNTService把Python程式變為服務
經過上面的介紹可以看出XYNTService可以把任何一個可執行程式作為一個服務來啟動,所以Python程式當然也可以了。下面給一個簡單的例子:
[Settings]
ServiceName=So.net
CheckProcessSeconds = 10
[Process0]
CommandLine = C:/python25/python.exe c:/11.py
WorkingDir= C:/
PauseStart= 1000
PauseEnd= 1000
UserInterface = No
Restart = Yes
安裝So.net服務:XYNTService.exe -i。
經過上面配置後,可以在沒有登入的時候就可以直接啟動So.net服務了,So.net服務會調用c:/11.py程式。並且每10秒檢測11.py進程是否啟用,如果不活動則重新啟動它。
參考了:
http://www.codeproject.com/system/xyntservice.asp