将批处理文件作为Windows服务运行

198
为了运行一个应用程序,需要启动一个批处理文件(例如启动Jetty,显示实时日志等)。只有在运行此批处理文件时,该应用程序才能正常工作。因此我被迫让这个批处理文件一直运行,并且不注销Windows服务器。
这个批处理文件能否作为服务来运行?我正在尝试从类似的问题中尝试一个建议。

33
批处理编程是 Stack Exchange 论坛上的一个适当话题。 - Harry Johnston
15
好问题。+1。版主太生气了...我还有另一个好的答案,但是问题已经关闭了。 - gavenkoa
我使用这个RunAsService代替:http://runasservice.com/。它要简单得多,没有XML配置的烦恼。基本上,它只是提供了RunAsService.exe可执行文件,可以将任何带有命令行参数的控制台应用程序包装成服务。我使用它来将Cygwin bash脚本作为服务运行!不幸的是,这个简单的工具似乎是闭源的。 - Kaz
14
提名以“程序员常用的软件工具”为基础重新开放。这个问题的答案显然是肯定的。同时请记住,在搜索“将Windows启动批处理文件作为服务”的第一个Google结果,所以无论是不是在一些管理员认为“主题内”的狭窄范围内,全世界都认为是相关的。我支持实用主义胜过教条主义的观点。 - Adam Cameron
类似的问题可以在ServerFault上找到:https://serverfault.com/questions/54676/how-to-create-a-service-running-a-bat-file-on-windows-2008-server - Stephen Quan
9个回答

190

NSSM完全免费且超级易用,可以在以管理员身份运行的命令提示符/终端中使用:

nssm install "YourCoolServiceNameLabel"

然后会出现一个对话框,让你选择要运行的文件所在的位置。

卸载

nssm remove "YourCoolServiceNameLabel"

我认为这应该绝对成为被接受的答案 :) - Newteq Developer
在我的情况下,我只是输入了命令"./nssm install serviceA",但当我尝试从控制面板服务启动我的服务时,它被暂停了,并且出现了错误提示:"该服务未返回错误,这可能是窗口内部错误"。现在我该怎么办? - Mishi
2
你知道是否有一种方法可以在输入时将所有必要的参数传递给 nssm,以避免弹出数据输入框 - 我正在尝试自动化这个过程? - amphibient
1
NSSM在我们的一些客户端被GDATA杀毒软件不断删除。是的,我知道,可以将其加入白名单...但是客户并不总是会做对他们有好处的事情。这就是悲哀的现实。 - Dreamspace President
1
@amphibient,您可以首先使用“nssm create <service_name> <application_path> <application_arguments>”创建一个服务,然后设置其他参数(例如,“nssm set <service_name> AppDirectory <app_directory>”)。 - Don
显示剩余2条评论

45

有一个内置的Windows cmd可以做到这一点:sc create。不像nssm那么花哨,但你不必下载额外的软件。

sc create "ServiceName" start= demand displayname= "DisplayName" binpath= [path to .bat file]

注意

  • start=demand表示您必须自行启动服务。选项包括:boot、system、auto、demand、disabled、delayed-auto。
  • 等号后面需要加空格。
  • 我在启动服务时遇到了一个错误,即服务没有及时响应,但是清楚地看到该服务已经成功运行了.bat文件。我还没有深入研究,但这个线程也遇到了同样的问题,并使用nssm来安装服务解决了它。

18
似乎Windows不能将.bat文件作为服务运行。 - Perkins
4
在我的情况下,批处理文件应该创建的文件没有被创建,程序也没有运行,所以我必须假设它没有启动。我设法通过创建服务来运行cmd.exe /C <batchfile> 来解决这个问题。请注意,我正在使用Windows 10,因此这可能是一些新的“安全”功能。 - Perkins
20
获取“_Error 1053:服务未能及时响应启动或控制请求。_” - Alex Klaus
2
如果从PowerShell运行,请使用完整的文件名sc.exe。正如错误提示的那样,sc是Set-Content的别名。 - Joseph
2
我们可以将 start type 中的 demand 替换为以下任何一种启动类型(boot、system、auto、demand、disabled、delayed-auto)。 - Udesh
显示剩余7条评论

13

无需额外软件。使用任务计划程序 -> 创建任务 -> 隐藏。隐藏的复选框在左下角。将任务设置为在登录时触发(或您喜欢的任何条件),并在操作选项卡中选择该任务。以隐藏方式运行它可以确保任务在后台静默运行,就像服务一样。

请注意,您还必须将程序设置为“无论用户是否登录”,否则程序仍将在前台运行。


这对我来说是解决方案。只需单击“隐藏”选项即可实现我的目标。 - GLJ
对我来说,这是一个完美的解决方案。 - Eduardo

10
在Windows 2019服务器上,您可以使用以下命令运行Minecraft Java服务器:
`sc create minecraft-server DisplayName= "minecraft-server" binpath= "cmd.exe /C C:\Users\Administrator\Desktop\rungui1151.lnk" type= own start= auto`
`.lnk`文件是指向批处理文件的标准Windows快捷方式。
批处理文件如下所示:
``` java -Xmx40960M -Xms40960M -d64 -jar minecraft_server.1.15.1.jar ```
这样做是因为:
服务无法知道如何在文件夹中启动,
cmd.exe不知道如何在文件夹中启动
启动服务将产生“及时性”的错误,但日志文件显示服务器正在运行。
如果您需要关闭服务器,请进入任务管理器并找到后台进程中的服务器Java,并结束它,或者使用/stop命令在游戏内终止服务器,对于其他程序/服务器,请使用与该服务器相关的方法。

3
如果您仔细阅读,就会注意到它包含了完美的答案,与一个例子有关。 - Goofyseeker311
2
@JeremyJStarcher 我认为这实际上是这里最好的答案。只是解释得不太好。但答案是使用binpath="cmd.exe /C [一些批处理文件]"。 - pomeroy
对我没用。最终使用了nssm解决了问题。 - javatar

3

由于NSSM已不再维护,您可以考虑使用WinSW。它有二进制文件,可以在有或没有.Net的情况下使用。

基本上,您需要创建一个XML文件,然后进行安装。以下是最小XML示例:

<service>

  <!-- ID of the service. It should be unique across the Windows system-->
  <id>myapp</id>

  <!-- Path to the executable, which should be started -->
  <!-- CAUTION: Don't put arguments here. Use <arguments> instead. -->
  <executable>%BASE%\myExecutable.exe</executable>

</service>

然后您可以安装并启动它:

winsw install myapp.xml
winsw start myapp.xml

不适用于批处理文件(v3) - Li3ro
@Li3ro,“批处理文件(v3)”是什么? - kaptan
我指的是WinSW v3.0.0-alpha.10(在Windows 10中)。 - Li3ro

3

正如Doug Currie所说,请使用RunAsService。

根据我的过去经验,您必须记住生成的服务将会:

  • 拥有完全不同的环境变量
  • 需要仔细检查权限问题
  • 如果打开任何类型的输入对话框可能会造成混乱

不确定最后一个是否仍然适用...在我之前参与的一个项目中,这是一场噩梦。


3
尽管它不是免费的(但售价为39美元),FireDaemon 对我非常有效,因此我必须推荐它。它可以运行您的批处理文件,但还具有许多其他非常有用的功能,例如调度、服务监视、基于 GUI 或 XML 的服务安装、依赖项、环境变量和日志管理。
我最初使用 FireDaemon 来启动 JBoss 应用程序服务器(run.bat),但很快意识到 FireDaemon 配置能力的丰富性使我可以放弃批处理文件,并在 FireDaemon 服务定义中重新创建其命令的意图。
如果您需要管理此服务(或从技术上讲,任何服务)的大量 Windows 服务器,则还有一个名为 Trinity 的超级 FireDaemon 可供查看。

1
安装NSSM并将.bat文件作为Windows服务运行。正常工作。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接