尝试通过 重新启动现有 Windows 服务时NSSM
,我随机收到以下消息,该消息写入错误日志/错误输出。关于如何纠正的任何想法?理想情况下,接受作为有效响应。
响应 START 控制的意外状态 SERVICE_START_PENDING
尝试通过 重新启动现有 Windows 服务时NSSM
,我随机收到以下消息,该消息写入错误日志/错误输出。关于如何纠正的任何想法?理想情况下,接受作为有效响应。
响应 START 控制的意外状态 SERVICE_START_PENDING
如果服务启动时间过长,您将收到“SERVICE_START_PENDING”(这意味着该服务尚未告诉 Windows 它已启动)。“太长”取决于发出启动请求的应用程序。在 NSSM 的情况下,这似乎很短,因此如果您的系统负载不足,则服务启动所需的时间比 NSSM 预期的要长。
似乎没有办法告诉 NSSM 启动或停止操作需要多长时间。对于停止请求,它甚至会忽略自己的关闭超时设置。然后,您使用 NSSM 的选择是从源代码编译并添加超时选项。否则使用不同的工具,例如 net:
net stop <service>
net start <service>
我相信这个问题是由服务本身引起的。
服务很可能存在错误并挂起、失败或花费太多时间才能正确停止。尝试启动它时会引发问题。
如果服务失败:在我看来,有一个潜在的解决方法,通过在服务属性中设置服务恢复选项。然后在服务失败时选择“运行程序”。然后编写一个批处理来获取这个服务的PID并杀死它,然后使用NSSM重新启动它。
在本批次中,您可以使用“SC 查询”命令来检查服务状态:
C:\Windows>sc query "MyService" | find "STATE"
STATE : 3 STOP_PENDING
请注意,如果您仅使用 NSSM 来隐藏窗口,则仅使用任务计划程序可能会达到相同的目标。
在任务属性的“常规”选项卡中。如果您选择“无论用户是否登录都运行”,这将从会话 0 运行,不会向您显示任何窗口。
然后你需要对你的计划任务做的是,像现在一样杀死/重新启动目标进程本身。这将更稳健地工作。
如果该服务不是官方的windows服务而是更多的EXE程序文件(你这边的dev)然后转换为带有NSSM的服务,那么失败的可能性很大。将程序重写/重新编译为实际的 Windows 服务可能会更好。
最近发生在我身上......我不仅无法重新启动服务而且停止它也不可能。
让我们杀了它。
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 :
taskkill /pid [PID] /f
此错误也与
Windows 无法停止本地计算机上的 [SERVICE-NAME] 服务。
错误 1053:服务未及时响应启动或控制请求。
问题是 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