15

尝试通过 重新启动现有 Windows 服务时NSSM,我随机收到以下消息,该消息写入错误日志/错误输出。关于如何纠正的任何想法?理想情况下,接受作为有效响应。

响应 START 控制的意外状态 SERVICE_START_PENDING

4

4 回答 4

1

如果服务启动时间过长,您将收到“SERVICE_START_PENDING”(这意味着该服务尚未告诉 Windows 它已启动)。“太长”取决于发出启动请求的应用程序。在 NSSM 的情况下,这似乎很短,因此如果您的系统负载不足,则服务启动所需的时间比 NSSM 预期的要长。

似乎没有办法告诉 NSSM 启动或停止操作需要多长时间。对于停止请求,它甚至会忽略自己的关闭超时设置。然后,您使用 NSSM 的选择是从源代码编译并添加超时选项。否则使用不同的工具,例如 net:

net stop <service>
net start <service>
于 2020-04-09T13:23:50.107 回答
1

我相信这个问题是由服务本身引起的。


服务很可能存在错误并挂起、失败或花费太多时间才能正确停止。尝试启动它时会引发问题。


如果服务失败:在我看来,有一个潜在的解决方法,通过在服务属性中设置服务恢复选项。然后在服务失败时选择“运行程序”。然后编写一个批处理来获取这个服务的PID并杀死它,然后使用NSSM重新启动它。

在本批次中,您可以使用“SC 查询”命令来检查服务状态:

C:\Windows>sc query "MyService" | find "STATE"
    STATE              : 3  STOP_PENDING

请注意,如果您仅使用 NSSM 来隐藏窗口,则仅使用任务计划程序可能会达到相同的目标。

在任务属性的“常规”选项卡中。如果您选择“无论用户是否登录都运行”,这将从会话 0 运行,不会向您显示任何窗口。

然后你需要对你的计划任务做的是,像现在一样杀死/重新启动目标进程本身。这将更稳健地工作。


如果该服务不是官方的windows服务而是更多的EXE程序文件(你这边的dev)然后转换为带有NSSM的服务,那么失败的可能性很大。将程序重写/重新编译为实际的 Windows 服务可能会更好。

于 2018-12-21T12:27:54.533 回答
0

最近发生在我身上......我不仅无法重新启动服务而且停止它也不可能。

让我们杀了它。

  1. 识别进程 ID (PID)。将[SERVICE-NAME]替换为您的服务名称。
sc queryex "[SERVICE-NAME]"

你应该得到这样的东西:

SERVICE_NAME: xxxxxxxxx
        TYPE               : 30  WIN32
        STATE              : 4  RUNNING
                                (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        PID                : 4812
        FLAGS              :
  1. 手动终止进程。将[PID]替换为上一步中的值。
taskkill /pid [PID] /f

此错误也与

Windows 无法停止本地计算机上的 [SERVICE-NAME] 服务。
错误 1053:服务未及时响应启动或控制请求。

于 2021-07-28T14:39:30.697 回答
0

问题是 NSSM 在等待您的服务启动时超时。不幸的是,似乎不可能为 NSSM 提供服务启动超时的自定义时间跨度。

一种解决方法是仍然使用 NSSM 安装服务,然后使用 PowerShell 启动和停止服务。PowerShell 允许您指定自己的等待超时(因为您可能不希望脚本无限期地等待)。

$serviceName = 'My service'
$service = Get-Service $serviceName -ErrorAction Ignore
Write-Verbose "Starting service '$serviceName'."
$service.Start()
$waitTimeout = New-TimeSpan -Seconds 5
$service.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running, $waitTimeout)

您可以在此处阅读有关 PowerShell Get-Service 命令的更多信息:https ://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service

于 2021-03-17T23:12:54.820 回答