我有一个 Windows 服务,需要使用 Windows 计划任务每 30 分钟停止和启动一次。
服务本身可以通过服务管理控制台手动停止(右键单击->停止,右键单击->启动)。
以下批处理文件,通过双击文件或通过命令行运行时几乎立即运行,并成功停止和启动服务:
net stop "Service Name"
net start "Service Name"
但是,当我创建每 30 分钟运行一次此批处理文件的计划任务时,出现了问题。
当我运行计划任务(右键单击 -> 运行)时,服务似乎停留在“正在停止”状态约 2 分钟,然后保持停止状态。计划任务似乎没有报告任何错误,只是在那里等待接下来的 30 分钟。
这是在 Windows Server 2008 R2 和以下计划任务选项上:
- 每天 08:00:00 开始
- 每 30 分钟重复一次,无限期
- 如果任务已经开始,就不要启动另一个任务
- 允许任务按需运行
- 如果任务失败,则每 30 分钟重新启动一次
- 以 NT AUTHORITY\SYSTEM 身份运行
- 即使用户未登录也运行
- 以最高权限运行
- 针对 Windows 7、Windows Server 2008 R2 进行配置
我很困惑,这是一个已知问题吗?我做错了什么吗?这里唯一看似类似的问题是这个:Windows 7 64位停止服务有问题吗?,但我不知道我的问题是否相关,而且我每次都能重现这个问题(它似乎从来没有作为计划任务工作,但如果我自己运行批处理文件,它就可以正常工作)
如果您能想到更好的问题标题,请随意更改!
与问题无关,但如果你感兴趣的话,我这样做的原因是暂时的解决与网络相关的问题,即服务(通过套接字连接与远程计算机上的另一个服务进行通信)由于不活动而经常关闭其端口。由于网络基础设施无法更改,服务本身最终将进行更新,以确保它与远程服务保持更频繁的联系。
根据建议进行更新
好的,无论出于什么原因,当我的小批处理文件作为计划任务运行时,服务需要很长时间才能停止,所以我编写了以下批处理文件,等待它停止(感谢@CoreTech 提供的 SC.exe 提示)
net stop "service name"
REM Wait for the service to stop (could take a minute or two...)
:loop_start
sc query "service name" | FIND "STATE" | FIND "STOPPED"
if errorlevel 1 goto :timeout_wait
REM Start the service again...
net start "service name"
goto :end
:timeout_wait
timeout 30
goto :loop_start
:end
这工作正常,但我仍然不知道为什么行为与手动停止服务并设置计划任务不同:(
最后更新
在把我的头贴在附近的砖墙上几个小时后*,我突然意识到,在这个臭名昭著的 Windows 服务死亡之环上还有第三个辐条......
涉及两个服务(我之前没有提到这一点,因为我认为它不相关)。事实证明,由于配置错误或可能存在破坏,两个服务都试图通过网络在同一个端口号上进行连接……冲突导致了问题,导致首先需要重新启动服务,并且导致重新启动服务时出现奇怪的行为。一旦我禁用一项服务并只使用一项服务,一切都会开始按预期工作……故事的寓意:不要只寻找解决方案,了解问题,解决方案就会自动出现在你面前!
我只是编造了这个寓意,这是一个正在进行的工作......
* 我:“头,砖墙;砖墙,头。”
头:握手时,发现它没有手......砰......
喵...”
砖墙:什么都不做……它只是一堵砖墙