当从任务计划程序调用批处理文件时,Windows 暂停服务而不是重新启动它

当从任务计划程序调用批处理文件时,Windows 暂停服务而不是重新启动它

我在 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 的路径不再有效。

相关内容