Windows 10 封裝普通EXE爲系統服務
Windows服務是指Windows操作系統中的一種運行在後臺的計算機程序。它在概念上類似於Unix/Linux守護進程,一個標準的Windows服務必須匹配服務控制管理器(SCM)(負責管理Windows服務的組件)的接口規則和協議,處理服務控制管理器(SCM)的啓動、停止和暫停消息。
SC
SC.exe 爲Windows系統自帶工具,可對Windows系統服務進行創建,查詢,啓動,停止,刪除等操作。
注意: sc.exe 只支持操作服務控制管理器(SCM)接口規範的系統服務. 一般的網絡服務進程如shadowsocks, nginx 等無法作爲服務直接啓動,需要用到接下來提到的服務封裝器.
SrvAny.exe
SrvAny.exe爲Windows Resource Kit中一個特殊組件。可以作爲服務封裝器來處理預期的服務接口(例如處理service_start,然後響應service_started或service_failed)並允許配置任何可執行文件或腳本作爲一個服務。
示例
這裏以shadowsocks爲示例:
Step 1
首先以SrvAny.exe作爲封裝器創建一個名爲”shadowsocks”系統服務框架, 服務暫時還無法使用, 具體的shadowsocks運行配置稍後通過註冊表詳細配置.
sc create "shadowsocks" binPath=C:\Go\bin\srvany.exe type= own start= auto DisplayName= "shadowsocks"
sc query 查詢服務狀態爲STOPPED.
sc query shadowsocks
SERVICE_NAME: ss_59488
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
Step 2
運行regedit, 定位到以下KEY:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\shadowsocks
右擊”shadowsocks”項, “新建”->”項”, 創建Parameters子項.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Services\Parameters
Step 3
在Parameters子項下添加”shadowsocks”運行配置:
名稱 | 類型 | 描敘 |
---|---|---|
AppDirectory | REG_SZ | 運行目錄 |
Application | REG_SZ | 運行exe路徑 |
AppParameters | REG_SZ | 運行exe參數 |
當服務控制管理器(SCM) 通知SrvAny.exe 封裝器啓動時, SrvAny.exe將查找註冊表以上配置,啓動指定Application .
Step 4
sc start shadowsocks
SERVICE_NAME: shadowsocks
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 31452
FLAGS
sc query shadowsocks
SERVICE_NAME: shadowsocks
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
其他封裝器
SrvStart
https://github.com/rozanski/srvstart
winsw
https://github.com/kohsuke/winsw
NSSM
推薦使用, 只需運行命令即可通過圖形界面完成配置, 具體可訪問 the Non-Sucking Service Manager.
nssm install <servicename>
Windows Service Manager (SrvMan)
http://tools.sysprogs.org/srvman/