响应 START 控制出现意外状态 SERVICE_START_PENDING

问题描述 投票:0回答:5

当尝试通过

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

响应 START 控制出现意外状态 SERVICE_START_PENDING

windows-services nssm
5个回答
2
投票

如果服务启动时间过长,您将收到“SERVICE_START_PENDING”(这意味着服务尚未告诉 Windows 它已启动)。 “太长”取决于发出启动请求的应用程序。对于 NSSM,这似乎非常短,因此如果您的系统处于负载状态,则服务的启动时间将比 NSSM 预期的时间长。

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

net stop <service>
net start <service>

1
投票

我认为这个问题是服务本身造成的。


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


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

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

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

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

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

那么您需要对计划任务执行的操作是,像现在一样终止/重新启动目标进程本身。 这将工作得更加稳健。


如果该服务不是官方的 Windows 服务,而是一个 EXE 程序文件(您这边的 dev),然后使用 NSSM 转换为服务,则失败的可能性很高。 最好将程序重写/重新编译为实际的 Windows 服务。


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://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service


0
投票

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

我们杀了它吧。

  1. 识别进程 ID (PID)。将 [服务名称] 替换为您的服务名称。
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:服务没有响应启动或控制 及时请求。


0
投票

正如该线程中其他几位人士所指出的,原因之一是 NSSM 没有等待足够长的时间来启动服务。我创建了一个等待服务以可配置超时启动的函数:

function IsServiceRunning(
  [Parameter(Mandatory=$true)]$ServiceName,
  [Parameter(Mandatory=$false)][int]$TimeoutSeconds = 10
) {
  $Service = Get-Service -Name "$ServiceName" -ErrorAction Stop
  if ($Service.Status -Eq "Running") {
    Write-Host "Service '$ServiceName' is already running"
    return $true;
  }
  Write-Host "Service '$ServiceName' has status '$($Service.Status)'"

  Write-Host "Waiting $TimeoutSeconds seconds for service '$ServiceName' to start"
  $TimeSpan = New-TimeSpan -Seconds $TimeoutSeconds
  try {
    $Service.WaitForStatus([System.ServiceProcess.ServiceControllerStatus]::Running, $TimeSpan)
  } catch [System.ServiceProcess.TimeoutException] {
    Write-Error "Exceeded timeout of $TimeoutSeconds seconds while waiting for service '$ServiceName' to start" -ErrorAction Stop
  }

  return $true
}

可以像这样与 NSSM 一起使用:

$ServiceName = "foo"

nssm.exe start $ServiceName
if($LASTEXITCODE -ne 0) {
  IsServiceRunning -ServiceName $ServiceName
}

我们像往常一样使用 NSSM 启动服务,但如果 NSSM 返回错误,我们知道这可能是误报,因此我们执行自己的检查。

© www.soinside.com 2019 - 2024. All rights reserved.