从可执行文件创建Windows服务

时间:2010-08-27 07:18:34

标签: windows windows-services

有没有快速的方法,给定一个可执行文件,创建一个Windows服务,在启动时启动它?

10 个答案:

答案 0 :(得分:399)

要从可执行文件创建Windows服务,您可以使用sc.exe

sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"

您必须在实际的exe路径周围加上引号,并在binPath=后面加上一个空格。

More information on the sc command can be found in Microsoft KB251192

请注意,它不适用于任何可执行文件:可执行文件必须是Windows服务(i.e. implement ServiceMain)。将非服务可执行文件注册为服务时,尝试启动服务时会出现以下错误:

  

错误1053:服务未及时响应启动或控制请求。

有些工具可以从任意非服务可执行文件创建Windows服务,请参阅其他答案以获取此类工具的示例。

答案 1 :(得分:202)

使用NSSM(非吸吮服务管理器)将.BAT或任何.EXE文件作为服务运行。

http://nssm.cc/

  • 第1步:下载NSSM
  • 第2步:使用nssm.exe install [serviceName]
  • 安装您的服务
  • 第3步:这将打开一个用于查找可执行文件的GUI

答案 2 :(得分:84)

延伸(Kevin Tong)回答。

第1步:下载&amp;解压缩nssm-2.24.zip

第2步:从命令行输入:

C:\> nssm.exe install [servicename]

它将打开如下GUI(示例为UT2003服务器),然后只需将其浏览到:yourapplication.exe

enter image description here

有关以下内容的更多信息:https://nssm.cc/usage

答案 3 :(得分:12)

许多现有答案包括安装时的人为干预。这可能是一个容易出错的过程。如果您有许多可执行文件想要作为服务安装,那么您要做的最后一件事就是在安装时手动执行这些操作。

针对上述场景,我创建了serman,这是一个命令行工具,用于将可执行文件安装为服务。您需要编写的所有内容(只编写一次)是一个简单的服务配置文件以及您的可执行文件。运行

serman install <path_to_config_file>

将安装该服务。 stdoutstderr都已记录。有关详细信息,请查看project website

工作配置文件非常简单,如下所示。但它也有许多有用的功能,例如下面的<env><persistent_env>

<service>
  <id>hello</id>
  <name>hello</name>
  <description>This service runs the hello application</description>

  <executable>node.exe</executable>

  <!-- 
       {{dir}} will be expanded to the containing directory of your 
       config file, which is normally where your executable locates 
   -->
  <arguments>"{{dir}}\hello.js"</arguments>

  <logmode>rotate</logmode>

  <!-- OPTIONAL FEATURE:
       NODE_ENV=production will be an environment variable 
       available to your application, but not visible outside 
       of your application
   -->
  <env name="NODE_ENV" value="production"/>

  <!-- OPTIONAL FEATURE:
       FOO_SERVICE_PORT=8989 will be persisted as an environment
       variable to the system.
   -->
  <persistent_env name="FOO_SERVICE_PORT" value="8989" />
</service>

答案 4 :(得分:6)

这些额外内容证明很有用..需要以管理员

执行
sc install <service_name> binpath=<binary_path>
sc stop    <service_name>
sc queryex <service_name>
sc delete  <service_name>

如果您的服务名称有任何空格,请用&#34;引号&#34;。

括起来

答案 5 :(得分:3)

我为此测试了一个好产品:AlwaysUp。不是免费的,但他们有30天的试用期,所以你可以尝试一下......

答案 6 :(得分:1)

Sergii Pozharov's answer相同,但带有PowerShell cmdlet:

New-Service -Name "MyService" -BinaryPathName "C:\Path\to\myservice.exe"

有关更多自定义信息,请参见New-Service

这仅适用于已实现Windows Services API的可执行文件。

答案 7 :(得分:0)

您可以签出我的小型免费实用程序来进行服务创建\编辑\删除操作。这是创建示例:

转到服务->修改->创建

enter image description here

可执行文件(Google驱动器):[Download]

源代码:[Download]

博客文章:[BlogLink]

服务编辑器类:WinServiceUtils.cs

答案 8 :(得分:0)

可能你所有的答案都更好,但是 - 只是为了完成选项的选择 - 我想提醒一下多年来使用的旧的类似方法:

SrvAny(由 InstSrv 安装)

如下所述: https://docs.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service

答案 9 :(得分:0)

几年前我创建了跨平台服务管理器软件,以便我可以在 Windows、Mac 和 Linux 操作系统上启动 PHP 和其他脚本语言作为系统服务:

https://github.com/cubiclesoft/service-manager

Service Manager 是一组预编译的二进制文件,它们使用几乎相同的命令行选项 (source code also available) 在目标操作系统上安装和管理系统服务。每个平台确实存在细微差别,但核心功能大多已标准化。

如果子进程死掉,服务管理器会自动重启它。

使用服务管理器启动的进程应该定期监视两个通知文件来处理重新启动和重新加载请求,但它们不一定必须这样做。如果服务管理器没有及时响应受控的重启/重新加载请求,它将强制重启子进程。