ChatGPT解决这个技术问题 Extra ChatGPT

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

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

这个批处理文件可以作为服务运行吗?我正在试验来自 similar question 的建议之一。

批处理编程是 Stack Exchange 的主题。
好问题。 +1。版主太生气了......我还有另一个很好的答案,但问题已关闭((
我改用这个 RunAsService:runasservice.com。使用起来要简单得多。没有 XML 配置废话。基本上,这只是为您提供 RunAsService.exe 可执行文件,它将任何带有命令行参数的控制台应用程序包装为服务。我用它来运行 Cygwin bash 脚本作为服务!!!不幸的是,这个简单的工具似乎是闭源的。
在“程序员常用的软件工具”的基础上提名重新开放。这个问题的答案肯定是。还要记住,这是搜索“windows start batch file as a service”时的第一个谷歌结果,所以无论是在狭窄的范围内,一些版主的事情是“主题”,世界其他地方都认为它是。我在这里投票支持实用主义而不是教条主义。
可以在 serverfault serverfault.com/questions/54676/… 找到类似的问题

J
Junior Mayhé

NSSM 完全免费且超级简单,以管理员身份运行命令提示符/终端:

nssm install "YourCoolServiceNameLabel"

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

卸载

nssm remove "YourCoolServiceNameLabel"

@publicRavi,您是否有可能接受这个答案?
我认为这绝对应该是公认的答案:)
你知道是否有办法在输入时给 nssm 所有必要的参数以避免弹出数据输入 - 我正在尝试自动化这个过程?
NSSM 不断被 GDATA 防病毒软件在我们的一些客户中删除。是的,我知道,列入白名单……但客户不会做对他们有利的事情。这就是可悲的事实。
@amphibient 你可以先用“nssm create ”创建一个服务,然后设置其他参数(例如“nssm set AppDirectory ”)
S
Stephen Martin

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


我有许多通过 robocopy 进行备份的批处理文件,这些文件是通过 Win 2003 服务器上运行的计划任务(转到控制面板、计划任务)启动的。工作一种享受...
这是 imo 的最佳解决方案。不需要第三方软件,也不需要命令行界面。此外,任务计划程序为触发器、条件等提供了许多选项。
现在我想通了:当任务在启动时运行时(使用“运行用户是否登录”)%UserProfile% 是 C:\Users\Default\ 任何其他时间它将是预期的 C:\Users\ ExpectedUser\ 这可能会为某些在其他计划任务中似乎可以正常工作的 .bat 文件造成神秘的故障。
计划任务是出了名的不可靠——我实际上遇到了这个问题,因为我一直在无缘无故地没有按时启动任务的所有问题。
请注意,如果您更改帐户密码,所有使用此帐户创建的计划任务都会静默停止运行(系统日志中的错误除外)。这是因为您输入了您的用户名/密码,它实际上存储了这个以您的身份登录。如果更改它,则登录失败。您可以使用固定的、不会过期的密码创建一个特殊的备份用户。我仍然对调度程序保持警惕,因为几个月后我让它因为其他原因停止工作。我忘记了为什么。看起来很脆弱。
w
w00ngy

有一个内置的 Windows cmd 可以执行此操作:sc create。不像nssm那么花哨,但您不必下载额外的软件。

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

笔记

start=demand 意味着您必须自己启动服务。选项包括:引导、系统、自动、需求、禁用、延迟自动

之后需要空格

我确实在服务启动时遇到了服务没有及时响应的错误,但很明显服务已经成功运行了.bat。还没有深入研究这个,但是这个线程遇到了同样的事情并使用 nssm 安装服务解决了它。


Windows 似乎不将 .bat 文件作为服务运行。
在我的情况下,批处理文件应该创建的文件没有创建并且程序没有运行,所以我必须假设它没有启动它。我设法通过创建服务来运行 cmd.exe /C 来解决它。请注意,我使用的是 Windows 10,所以这可能是一些新的“安全”问题。
得到“错误1053:服务没有及时响应启动或控制请求。”
如果从 powershell 运行,请使用完整的文件名 sc.exe。正如错误会告诉你的那样,sc 是 Set-Content 的别名。
代替需求作为启动类型,我们可以将其中任何一个指定为启动类型(启动、系统、自动、需求、禁用、延迟自动)
G
Goofyseeker311

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

sc create 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命令终止服务器,或者对于其他程序/服务器,使用方法与服务器相关。


如果您阅读正确,您会注意到它包含与示例相关的完美答案
@JeremyJStarcher 我认为这实际上是这里最好的答案。只是没有很好地解释。但答案是使用 binpath="cmd.exe /C [一些批处理文件]"
对我不起作用。最后用nssm做到了。
Z
Zediiiii

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

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


l
lexu

正如 Doug Currie 所说,使用 RunAsService。

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

有一组完全不同的环境变量

必须仔细检查权限/权限问题

如果它打开询问任何类型输入的对话框,可能会造成严重破坏

不确定最后一个是否仍然适用……这是我前段时间从事的一个项目中的一个大噩梦。


N
Nicholas

虽然它不是免费的(但 39 美元),但 FireDaemon 对我来说效果很好,我不得不推荐它。它将运行您的批处理文件,但具有许多额外且非常有用的功能,例如调度、服务监控、基于 GUI 或 XML 的服务安装、依赖项、环境变量和日志管理。

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

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


k
kaptan

由于 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

k
kumar

安装 NSSM 并将 .bat 文件作为 Windows 服务运行。按预期工作