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


159

为了运行一个应用程序,必须启动一个批处理文件(执行启动Jetty,显示实时日志等操作)。仅当此批处理文件正在运行时,该应用程序才能运行。因此,我被迫运行此批处理文件,而不从Windows服务器注销。

该批处理文件可以作为服务运行吗?我正在尝试一个类似问题的建议之一。


27
批量编程是Stack Exchange的主题。
哈里·约翰斯顿

12
好问题。+1。主持人太生气了。。。我也有另一个很好的回答,但问题已经解决了((
Givenkoa 2015年

我改用RunAsService:runasservice.com。使用起来非常简单。没有XML配置废话。基本上,这只是为您提供RunAsService.exe可执行文件,该文件将任何带有命令行参数的控制台应用程序包装为服务。我用它来运行Cygwin bash脚本作为服务!!!不幸的是,这个简单的工具似乎是封闭源代码。
卡兹2015年

8
提名根据“程序员常用的软件工具”重新打开。这个问题的答案肯定是哪个。还请记住,这是搜索“ Windows启动批处理文件即服务”时的第一个Google结果,因此,某些主持人正在讨论的话题是否在狭窄范围内,世界其他地方都认为是。我在这里赞成实用主义而不是教条主义。
亚当·卡梅伦

类似的问题可以在serverfault找到serverfault.com/questions/54676/...
斯蒂芬·泉

Answers:


151

NSSM是完全免费的,非常容易,以管理员身份运行命令提示符/终端:

nssm install "YourCoolServiceNameLabel"

然后将出现一个对话框,您可以选择要在哪里运行文件。

卸载

nssm remove "YourCoolServiceNameLabel"

25
+1没听说过,但是很好。NSSM确实不吮吸!
拜伦·惠特洛克

1
我花了2分钟,安装服务
本·王尔德

3
@初级M谢谢!!你救了我。我为此花了4个小时。谢谢!!
verystrongjoe 2015年

2
您是否知道是否有一种方法可以nssm在输入时提供所有必需的arg以避免弹出数据输入-我正在尝试使过程自动化?
两栖游戏'17

1
GSM防病毒软件不断在某些客户中删除NSSM。是的,我知道,将其列入白名单...但是客户不会做对他们有好处的事情。那是可悲的事实。
Dreamspace总裁,

61

为什么不简单地将其设置为计划在启动时运行的计划任务?


1
我有许多批处理文件通过robocopy进行备份,这些文件是通过Win 2003服务器上运行的计划任务(转到“控制面板”,“计划任务”)启动的。工作对待...
SAL

只是使用用于监控备份服务的脚本来完成此操作。它像一种魅力。
音乐2

1
这是imo的最佳解决方案。无需第三方软件,也不需要命令行界面。加上任务计划程序提供了很多的选择的触发器,条件等
开发

3
现在我知道了,可以正常工作:当任务在启动时运行时(带有“运行是否登录用户”),%UserProfile%是C:\ Users \ Default \其他任何时候,它将是预期的C:\ Users \ ExpectedUser \这可能会为某些似乎在其他计划任务中正常工作的.bat文件造成神秘的故障。
user1754036 '16

2
排定的任务众所周知是不可靠的-实际上,我遇到了这个问题,因为我遇到了所有任务,这些任务由于没有明显的原因而无法按时启动。

22

有一个内置的Windows cmd可以做到这一点:sc create。不像nssm那样花哨,但是您不必下载其他软件。

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

注意

  • start = demand意味着您必须自己启动服务
  • 之后需要空格 =
  • 我在服务启动时确实遇到错误,该服务未及时响应,但是很明显该服务已成功运行.bat。尚未深入研究,但是该线程遇到了同样的事情,并使用nssm安装了该服务以解决该问题。

4
Windows似乎没有将.bat文件作为服务运行。
珀金斯'18

@Perkins-我的矿昨天在几台机器上工作。您是否正在经历一些特定的事情?我确实遇到了一个错误,即服务在启动时未及时响应,但是.bat文件是用于启动Kibana node.js服务器的,即使出现错误也可以成功运行。这个线程中的人似乎也经历过同样的事情,但是并没有使用nssm。stackoverflow.com/a/40130630/885535
w00ngy

2
在我的情况下,批处理文件应该创建的文件没有创建,程序也没有运行,所以我不得不假设它没有启动它。我设法通过创建运行cmd.exe / C <batchfile>的服务来解决此问题。请注意,我正在使用Windows 10,因此这可能是一些新的“安全性”问题。
珀金斯

@Perkins我刚刚让它在win10 1803上运行没问题,启动了我的node.js服务器。从cmd或powershell调用时,bat文件是否创建文件并运行服务?启动服务时会收到任何味精盒吗?您的服务是否有权访问这些目录?您可以通过写入本地日志文件在bat中添加一些错误日志记录,看是否可行。
w00ngy

1
得到“ 错误1053:服务没有及时响应启动或控制请求。
Alex Klaus

5

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

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


3

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

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

  • 有一套完全不同的环境变量
  • 必须仔细检查权利/许可问题
  • 如果打开要求任何输入的对话框,可能会造成严重破坏

不知道最后一个是否仍然适用...这是我前一段时间从事的一个项目中的一匹夜马。


3

虽然它不是免费的(但39美元),但是FireDaemon对我来说是如此出色,我不得不推荐它。它会运行您的批处理文件,但具有许多非常有用的附加功能,例如计划,服务监视,基于GUI或XML的服务安装,依赖项,环境变量和日志管理。

我开始使用FireDaemon启动JBoss应用程序服务器(run.bat),但是不久之后,我意识到FireDaemon配置功能的丰富性使我能够放弃批处理文件并在FireDaemon服务定义中重新创建其命令的意图。

还有一个称为Trinity的SUPER FireDaemon,如果您有大量Windows服务器来管理此服务(或从技术上讲,是任何服务),则可能要看一下。


2

在Windows 2019 Server上,您可以使用以下命令运行Minecraft Java服务器:

sc创建minecraft-server DisplayName =“ minecraft-server” binpath =“ cmd.exe /CC:\Users\Administrator\Desktop\rungui1151.lnk” type = own start = auto

.lnk文件是批处理文件的标准Windows快捷方式。

-.bat文件开始-

java -Xmx40960M -Xms40960M -d64 -jar minecraft_server.1.15.1.jar

-.bat文件结束-

这是因为:

服务不知道如何在文件夹中启动,

cmd.exe不知道如何在文件夹中启动

启动服务将产生“及时方式”错误,但是日志文件显示服务器正在运行。

如果您需要关闭服务器,只需进入任务管理器并在后台进程中找到服务器Java并结束它,或者使用/ stop命令从游戏中终止服务器,或者对于其他程序/服务器,请使用以下方法与服务器有关。


这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;而是提供不需要问询者澄清的答案。- 评论
杰里米·J·斯塔彻

1
如果正确阅读,您会发现它包含与示例相关的完美答案
Goofyseeker311

0

AlwaysUp将轻松将批处理文件作为服务运行。它类似于FireDaemon(如上所述),并且不是免费的,但是您可能会发现丰富的功能集是在专业环境中的资产。

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.