![当从任务计划程序调用批处理文件时,Windows 暂停服务而不是重新启动它](https://linux22.com/image/1425323/%E5%BD%93%E4%BB%8E%E4%BB%BB%E5%8A%A1%E8%AE%A1%E5%88%92%E7%A8%8B%E5%BA%8F%E8%B0%83%E7%94%A8%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E6%97%B6%EF%BC%8CWindows%20%E6%9A%82%E5%81%9C%E6%9C%8D%E5%8A%A1%E8%80%8C%E4%B8%8D%E6%98%AF%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E5%AE%83.png)
我在 Windows 任务计划程序中设置了一个任务,每天在特定时间运行。该任务只是执行我创建的批处理文件来重新启动我的 Windows 服务。这是该文件的内容:
net stop "MyService"
net start "MyService"
在大多数情况下,这似乎效果很好,但有时服务实际上会自行暂停,而不是停止/启动。我稍后会回来,它会一直处于暂停状态。
为什么任务调度程序会暂停我的服务而不是启动它,我该如何补救?
答案1
通过 NSSM 之类的实用程序将 EXE 转换为服务充满了失败的可能性。
甚至 NSSM 也在其主页:
“...如果您的应用程序运行良好,您可以配置 nssm 以避免重新启动它的所有责任,并让 Windows 负责恢复操作。”
听起来你的应用程序“表现不佳”。
尝试使用 NSSM 停止/启动并重新启动服务,或者如果这没有帮助,请将该程序重写/重新编译为实际的 Windows 服务。
答案2
我相信该问题是由服务本身引起的,但可以使用“SC query”命令来解决。
C:\Windows>sc query "MyService" | find "STATE"
STATE : 3 STOP_PENDING
可以在批处理文件中添加一个检查例程,以便在经过一段时间后仔细检查服务状态,如果服务进程挂起则终止该服务进程(taskkill /f),然后重新启动该服务(net start)。
此外,如果您使用 NSSM 来隐藏窗口,则不必使用 NSSM,而只需使用任务计划程序即可实现相同目标。(但如果您的目标不同 - 请忽略以下内容。)
这是任务属性上“常规”选项卡的一部分。如果您选择“无论用户是否登录都运行”,这将从会话 0 运行,不会向您显示任何窗口。然后您需要在计划任务上执行的操作是,像现在一样终止/重新启动目标进程本身。这将更加可靠。
答案3
如果您使用 NSSM 将 logstash 作为服务,并且自创建 NSSM 用于启动服务的 .bat 文件以来更新了 Java 安装,您可能会看到这种情况,您可能会发现批处理文件中 java.exe 的路径不再有效。