【发布时间】:2011-04-04 16:05:59
【问题描述】:
在给定一个可执行文件的情况下,有没有什么快速的方法可以创建一个 Windows 服务,该服务在启动时会启动它?
【问题讨论】:
-
Here 是微软关于如何实现这一点的说明。
在给定一个可执行文件的情况下,有没有什么快速的方法可以创建一个 Windows 服务,该服务在启动时会启动它?
【问题讨论】:
要从可执行文件创建 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 服务,有关此类工具的示例,请参阅其他答案。
【讨论】:
binpath= 之后的空格以及必须用双引号将可执行路径括起来是完全错误的,至少对于 Windows 10 而言。当且仅当路径包含特殊字符(如空格)时才需要引用.此外,大小写(小写/大写/混合大小写)在任何地方都无关紧要,在变量名中也是如此,displayname="my service" 是在创建服务以查看为第一行时传递命令行的另一个好东西(Name)在services.msc。
binPath= 后面的空格是我在 Windows 7 上需要的,但在 Windows 10 上不需要
使用 NSSM(非 Sucking 服务管理器)将 .BAT 或任何 .EXE 文件作为服务运行。
nssm.exe install [serviceName] 安装您的服务
【讨论】:
扩展(Kevin Tong)答案。
第一步:下载并解压nssm-2.24.zip
第 2 步: 从命令行输入:
C:\> nssm.exe install [servicename]
它会打开如下图所示的GUI(例如UT2003服务器),然后简单地浏览到:yourapplication.exe
【讨论】:
nssm.exe install [serviceName]。此解决方案有效,但如果您有 GUI 应用程序,它将无法在 Win Serever2003 上运行。如果您以后想删除它,请使用nssm.exe remove [youservicename]
nginx 没有必要并且具有误导性。该命令在没有它的情况下也可以工作。如果要从命令提示符提供服务名称,它是可选参数。
许多现有答案都包括安装时的人工干预。这可能是一个容易出错的过程。如果您有许多可执行文件想要作为服务安装,那么您最不想做的就是在安装时手动执行它们。
针对上述场景,我创建了serman,这是一个用于将可执行文件安装为服务的命令行工具。您只需编写一个简单的服务配置文件以及可执行文件即可(并且只需要编写一次)。运行
serman install <path_to_config_file>
将安装该服务。 stdout 和 stderr 都已记录。欲了解更多信息,请查看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>
【讨论】:
这些附加功能被证明是有用的.. 需要以 Administrator
的身份执行sc create <service_name> binpath= "<binary_path>"
sc stop <service_name>
sc queryex <service_name>
sc delete <service_name>
如果您的服务名称有空格,请用“引号”括起来。
【讨论】:
我为此测试了一个很好的产品:AlwaysUp。不是免费的,但他们有 30 天的试用期,所以你可以试一试...
【讨论】:
与Sergii Pozharov's answer 相同,但使用 PowerShell cmdlet:
New-Service -Name "MyService" -BinaryPathName "C:\Path\to\myservice.exe"
更多定制请见New-Service。
这仅适用于已经实现 Windows Services API 的可执行文件。
【讨论】:
您可以查看我用于服务创建\编辑\删除操作的小型免费实用程序。这是创建示例:
转到服务 -> 修改 -> 创建
可执行文件(谷歌驱动器):[Download]
源码:[Download]
博文:[BlogLink]
服务编辑器类:WinServiceUtils.cs
【讨论】:
几年前我创建了跨平台服务管理器软件,以便我可以在 Windows、Mac 和 Linux 操作系统上启动 PHP 和其他脚本语言作为系统服务:
https://github.com/cubiclesoft/service-manager
Service Manager 是一组预编译的二进制文件,它们使用几乎相同的命令行选项 (source code also available) 在目标操作系统上安装和管理系统服务。每个平台确实有细微的差异,但核心功能大多是标准化的。
如果子进程死亡,服务管理器会自动重启它。
使用 Service Manager 启动的进程应定期监视两个通知文件以处理重新启动和重新加载请求,但它们不一定必须这样做。如果服务管理器没有及时响应受控的重新启动/重新加载请求,它将强制重新启动子进程。
【讨论】:
可能你所有的答案都更好,但是 - 只是为了完整地选择选项 - 我想提醒一下多年来使用的旧的类似方法:
SrvAny(由 InstSrv 安装)
如此处所述: https://docs.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service
【讨论】: