主頁 > 軟體設計 > 太陽當空照-Windows服務化方式instsrv與srvany

太陽當空照-Windows服務化方式instsrv與srvany

2021-07-29 07:08:45 軟體設計

前言

之前的文章中,涉及到服務化部分太陽當空照-Windows服務化sc.exe以及太陽當空照-Windows服務化方式腳本封裝sc指令兩章博文內容中,分別簡單講解了,使用sc.exe在符合Windows服務化的要求的應用程式前提下,實作服務的注冊和運行,以及實作自定義sc指令的腳本化操作方式,引導式地對服務實作基本操作,同樣的哪怕是提高互動體驗,本質上,sc局限性也是很明顯的,對能夠實作服務化程式有直接要求,如果是現有需要服務化的應用程式并不支持服務化,哪怕直接注冊,對應服務也無法啟動成功,這在實際使用程序中,三方的應用程式服務化,尤為明顯,于是乎,晚上查找到查找到包含在微軟Microsoft Windows Resource Kit Toolsinstsrv.exesrvany.exe,通過一篇文章Gist:https://gist.github.com/eyecatchup/0107bab3d92473cb8a3d3547848fc442得知這個微軟提供的工具包是針對的Windows Server以及Windows XP,高版本系統以后,沒有與之定義版本,只能使用老版本rktools.exe進行安裝,而rktools.exe實際就是Microsoft Windows Resource Kit Tools全家桶的簡稱,原文內容如下:

Additional Information

Though the available RK-Tools package is named “Microsoft? Windows? Server 2003 RK-Tools” and it was specifically released for Server 2003, all tools have official and full Windows? XP support, too.

Unsupported OS Versions

Though not officially supported, you can also install the RK-Tools Server 2003 bundle on Windows? Vista, Windows? 7 and Windows? 10, but note that some of the tools will not work as intended or not work at all (e.g. some tools generate errors like Dll missing).

Notes for Windows? 7

In Windows? 7, when you launch the installer, you will get an error saying This program has known compatibility issues. Just ignore the warning and click Run program and continue with installation.

對應的全家桶包,請留下評論或私信筆者進行獲取

ggcy-blog-service-sc-header

安裝rktools

需要注意的是,安裝步驟不是必須項,如果本地目錄C:\Program Files (x86)\Windows Resource Kits\Tools\已存在,則本機已經安裝對應工具包,可以跳過此步驟,轉到下一步,程式服務化注冊

左鍵雙擊運行rktools.exe

blog-jrz-instsrvany-install01

blog-jrz-instsrvany-install02

依據提示資訊,填寫當前用戶資訊,無特殊要求

blog-jrz-instsrvany-install03

安裝默認路徑為C:\Program Files (x86)\Windows Resource Kits\Tools\

blog-jrz-instsrvany-install04

點擊安裝后,Windows 10會提示是否安裝來之某一個路徑下的rktools.msi,確認安裝,選擇是,否則選擇否

blog-jrz-instsrvany-install05

blog-jrz-instsrvany-install06

查看系統環境變數中,Pathpath已經包含了對應的全家桶安裝目錄,沒有就自己手動添加

blog-jrz-instsrvany-env-path

安裝完成之后,轉到上述的安裝目錄中,發現已經包含instsrv.exesrvany.exe,或者打開cmd指令執行指令

>instsrv /?
Installs and removes system services from NT

INSTSRV <service name> (<exe location> | REMOVE)
  [-a <Account Name>] [-p <Account Password>]

  Install service example:

    INSTSRV MyService C:\MyDir\DiskService.Exe
    -OR-
    INSTSRV MyService C:\mailsrv\mailsrv.exe -a MYDOMAIN\joebob -p foo

  Remove service example:

    INSTSRV MyService REMOVE

工具簡述

instsrv.exe

安裝和洗掉系統服務,允許為Windows NT應用程式和某些16為應用程式(非批處理檔案),創建Windows NT用戶定義的服務

>instsrv /?
Installs and removes system services from NT

INSTSRV <service name> (<exe location> | REMOVE)
  [-a <Account Name>] [-p <Account Password>]

  Install service example:

    INSTSRV MyService C:\MyDir\DiskService.Exe
    -OR-
    INSTSRV MyService C:\mailsrv\mailsrv.exe -a MYDOMAIN\joebob -p foo

  Remove service example:

    INSTSRV MyService REMOVE

srvany.exe

允許Windows NT應用程式作為服務運行,實際上srvany.exe是作為目標程式的服務套殼程式,用于接受服務操作的相關指令,實作被包殼程式的運行和停止,與instsrv.exe一起使用

創建自定義服務

>[path]\instsrv.exe [servicename] [path]\srvany.exe

path對應實際的instsrv.exesrvany.exe所屬目錄,依據上述rktools.exe方式安裝,不需要進行設定,默認配置了系統環境變數

servicename為需要注冊的服務名稱,由用戶自定義

案例

此處以nginx.exe實作服務化為例子,nginx.exe所在目錄為D:\Program Files\nginx-1.21.1nginx.conf組態檔內容如下,訪問埠為7080

.....省略......
http {
.....省略......
    server {
        listen       7080;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
.....省略......
    }
}

以管理員身份啟動cmd,執行如下指令,否則將執行指令失敗,提示You are not authorized to do this - please contact your system Administrator,意思是當前賬戶沒有權限執行這個服務操作,需要管理員權限

>instsrv nginx  "C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe"
The service was successfuly added!

Make sure that you go into the Control Panel and use
the Services applet to change the Account Name and
Password that this newly installed service will use
for its Security Context.

查詢服務

方式一
sc query nginx

SERVICE_NAME: nginx
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 1077  (0x435)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
方式二

打開【任務管理器】-【服務】,可以查找到一個名為nginx的服務,當前狀態為停止狀態

blog-jrz-instsrvany-registsrv

方式三

查看注冊表

執行regedit.exe,查看注冊表,查找對應注冊清單中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[servicename](此處為nginx)對應的ImagePath是否為C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe

如果是,則表示,服務注冊成功

配置服務[修改前先匯出備份]

備份

服務注冊成功之后,需要進行對應的服務程式配置,由于注冊表配置屬于比較危險的操作,配置錯誤有可能影響到系統的正常使用,修改前,先對目標nginx進行匯出備份處理,操作如下,【選中nginx節點】-單擊右鍵【匯出】特定位置保留一個xxx.reg檔案,此處設定為nginx.reg

添加配置

nginx節點下,添加,名稱為Parameters

之后在Parameters下添加幾個字串值

AppDirectory表示服務運行的作業目錄

Application表示服務程式對應的物理地址

AppParameters表示服務運行攜帶的默認引數,默認為空值

結果如下:

blog-jrz-instsrvany-cfglist

啟動服務

方式一

配置好之后,嘗試通過管理員權限運行cmd,進行服務nginx的運行

>sc start nginx

SERVICE_NAME: nginx
        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                : 72712
        FLAGS              :
>sc query nginx

SERVICE_NAME: nginx
        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
方式二

執行net start [servicename]進行服務啟動

>net start nginx
nginx 服務正在啟動 .
nginx 服務已經啟動成功,

查找行程

查看實際系統中啟動的對應服務所屬應用行程

>tasklist /fi "imagename eq nginx.exe"
映像名稱                       PID 會話名              會話#       記憶體使用
========================= ======== ================ =========== ============
nginx.exe                    68272 Services                   0     17,892 K
nginx.exe                    67928 Services                   0     18,204 K

瀏覽器訪問http://localhost:7080,出現如下結果,表示服務啟動成功

blog-jrz-instsrvany-runsrv

停止服務

方式一

使用sc stop [servicename]

>sc stop nginx

SERVICE_NAME: nginx
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
方式二

使用net stop [servicename]

>net stop nginx
nginx 服務正在停止.
nginx 服務已成功停止,
查看行程

服務正常停止時,查看結果

>tasklist /fi "imagename eq nginx.exe"
資訊: 沒有運行的任務匹配指定標準,

此處nginx屬于多行程,結束服務自后,實際上本地還有行程并未完全退出

>tasklist /fi "imagename eq nginx.exe"
映像名稱                       PID 會話名              會話#       記憶體使用
========================= ======== ================ =========== ============
nginx.exe                    38432 Services                   0     17,876 K
方式三

執行任務結束指令taskkill /T /F /IM [appname]

>taskkill /T /F  /IM nginx.exe
成功: 已終止 PID 56132 (屬于 PID 70920 子行程)的行程,
成功: 已終止 PID 70920 (屬于 PID 74512 子行程)的行程,
成功: 已終止 PID 74512 (屬于 PID 67556 子行程)的行程,
注意

需要注意的是,方式一方式二停止服務,比較適合單行程應用程式,如果對應服務化的程式為多行程程式,改方式僅僅只能停止部分行程,例如當前案例nginx以此種方式就無法徹底結束所有行程,如果非要全部退出,可以直接使用方式三,雖然粗暴,但是確實使用,能夠滿足結束服務的需求

卸載服務

方式一

使用instsrv [servicename] remove

>instsrv nginx remove

The service was successfully deleted!
方式二

使用sc delete [servicename]

>sc delete nginx
[SC] DeleteService 成功

總結

筆者簡單的通過本地安裝rktools.exe去獲取到對應的instsrv.exesrvany.exe,依靠這倆工具,實作本地不遵循Windows服務化規范的應用程式擬態(個人認為這不屬于實際的應用服務化,而是對服務化狀態進行模擬實作的折中功能)服務化,對應用的操作逐漸接近實作本質,如果想繼續了解服務化內容,可關注筆者留言評論或私信

參考鏈接

【1】https://zhuanlan.zhihu.com/p/93808282

【2】https://wangye.org/blog/archives/42/

【3】https://www.cnblogs.com/zhaiqianfeng/p/4622561.html

【4】https://gist.github.com/eyecatchup/0107bab3d92473cb8a3d3547848fc442

【5】https://docs.microsoft.com/zh-cn/troubleshoot/windows-client/deployment/create-user-defined-service

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/290622.html

標籤:其他

上一篇:nginx利用core核心模塊構建兩個虛擬主機

下一篇:nginx實作geoip模塊的實驗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more