[Python]用XYNTService把Python程式變為服務

來源:互聯網
上載者:User
[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的好處:

  • 它能夠啟動你指定的任意多個程式。被啟動的程式將像 NT 服務一樣運行(例如,不用使用者登陸機器,它們便會在後台運行)。

  • 在沒有合適特權情況下,使用者不能終止由此服務啟動的程式(除非機器關閉)。

  • 可以在 NT 服務之外測試和調試你的程式。例如,可以在 DevStudio調試器中運行你的程式,單步進入原始碼中尋找錯誤等。當"調試無錯"後,你將它配置成產品,從 NT 服務啟動它。

1.2. XYNTService

XYNTService.exe是此NT服務程式可執行檔的名字,可以在此下載。

 

  • 為了安裝(install)服務,在命令提示字元下運行下面命令:XYNTService -i

  • 為了卸載(un-install)服務,在命令提示字元下運行下面命令:XYNTService -u

預設情況下,在電腦重啟時,安裝的服務便會自動啟動。你也可以使用服務表徵圖從控制台啟動和關閉服務。服務啟動時,它將會一個挨一個地建立在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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.