Answers:
要从可执行文件创建Windows服务,可以使用sc.exe
:
sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"
您必须在实际exe
路径周围加上引号,并在后面加上一个空格binPath=
。
有关该sc
命令的更多信息,请参见Microsoft KB251192。
请注意,它不适用于任何可执行文件:可执行文件必须是Windows Service(即,实现ServiceMain)。将非服务可执行文件注册为服务时,尝试启动该服务时会出现以下错误:
错误1053:服务未及时响应启动或控制请求。
有一些工具可以从任意的非服务可执行文件创建Windows服务,有关此类工具的示例,请参见其他答案。
binpath=
至少对于Windows 10,至少必须在Windows 10 后面加上空格用双引号引起来的可执行路径是完全错误的。只有且仅当路径包含特殊字符(如空格)时,才需要使用引号。同样,在变量名中,大小写(大小写/小写/混合大小写)也无处不在,这displayname="my service"
是在创建服务以查看为第一行(Name
)时在命令行中传递的另一个好东西services.msc
。
binPath=
在Windows 7而非Windows 10上对我来说是必需的空格
使用NSSM(非吮吸服务管理器)将.BAT或任何.EXE文件作为服务运行。
nssm.exe install [serviceName]
扩展(Kevin Tong)答案。
步骤1:下载并解压缩nssm-2.24.zip
步骤2:从命令行输入:
C:\> nssm.exe install [servicename]
它将打开如下所示的GUI(示例为UT2003服务器),然后只需将其浏览至:yourapplication.exe
有关更多信息:https : //nssm.cc/usage
nssm.exe install [serviceName]
。此解决方案有效,但是如果您有GUI应用程序,则在Win Serever2003上将无法使用。如果您以后要删除它,请使用nssm.exe remove [youservicename]
nginx
没有必要的,并且具有误导性。如果没有该命令,该命令也将起作用。如果要在命令提示符下提供服务名称,则它是可选参数。
许多现有的答案包括安装时的人为干预。这可能是一个容易出错的过程。如果您想将许多可执行文件作为服务安装,那么最后要做的就是在安装时手动执行它们。
针对上述情况,我创建了serman,这是一个命令行工具,用于将可执行文件安装为服务。您只需要编写(并且只编写一次)便是一个简单的服务配置文件以及可执行文件。跑
serman install <path_to_config_file>
将安装该服务。stdout
并stderr
全部记录下来。有关更多信息,请访问项目网站。
有效的配置文件非常简单,如下所示。但是它也具有许多有用的功能,例如<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>
这些附加功能非常有用..需要以管理员身份执行
sc create <service_name> binpath=<binary_path>
sc stop <service_name>
sc queryex <service_name>
sc delete <service_name>
如果您的服务名称有空格,请用“引号”引起来。
sc create <service_name> binpath= <binary_path>