在powershell中,我已经看到了多种停止服务的方法
更现代的方式
Stop-Service wuauserv
更传统的方式
NET STOP WUAUSERV
传统方式is much more difficult to automate because it is not natively idempotent.
我有使用packer构建windows黄金映像的powershell脚本。最初使用的脚本为NET STOP
。我发现一旦切换到Stop-Service
,我在安装Windows更新后重启VM时似乎会出现更频繁的故障。
Stop-Service
和NET STOP
都会产生相同的结果吗?或者它们之间是否有差异可以解释为什么遗留的似乎更可靠?
答案 0 :(得分:5)
对于以下的Windows服务:
net stop
和Stop-Service
的行为应该相同,即同步:
也就是说,他们向指定的服务发送停止请求并等待停止完成(net stop
总是等待,而在PSv5 +中,您可以选择不等待Stop-Service
-NoWait
切换。
与net stop
(如果服务已停止报告错误)不同,Stop-Service
幂等(展示所需状态逻辑) :如果目标服务已处于停止状态,则该命令是安静的无操作。
(顺便说一下:Start-Service
也是同步的,但总是如此,也是幂等的。)
Set-Service -Status Stopped
应与Stop-Service
的行为相同,但以下情况除外:
与Stop-Service
不同,它不支持-Force
以停止运行依赖项的服务(依赖于服务被停止的其他服务)。
由于what I presume to be a bug,您甚至无法停止自己依赖其他服务的服务(!)。
实际上,从Windows PowerShell v5.1 / PowerShell Core v6.0-rc开始,您只能停止Set-Service -Status Stopped
没有依赖项的服务(没有依赖它们的服务),也不能他们自己依赖其他服务。
可选阅读:查看Stop-Service
和Start-Service
源代码:
GitHub上的公开源代码适用于PowerShell的跨平台 Core 版本,但看起来有问题的代码基本上是从 Windows 中未经修改的PowerShell版本。
Stop-Service
:part where the code waits for the service to be in the ServiceControllerStatus.Stopped
state [1]
,只有在明确指定-NoWait
开关时才会被绕过,在这种情况下,变量waitForServiceToStop
设置为false
。
Start-Service
:part where the code invariably waits for the service to be in the ServiceControllerStatus.Running
state。
[1]如果达到目标状态takes longer than 2 seconds,等待循环会在继续时发出警告(每 2秒)等待;如果服务意外地既没有处于目标状态 - 挂起状态也不处于目标状态,那么等待仅中止并带有错误。
答案 1 :(得分:3)
区别在于服务实际停止。 net stop service
等待服务停止,或至少发送它现在已停止"的事件。 "其他遗产" sc stop service
的方式在发送停止信号后立即退出,并转储当前通常为STOP_PENDING
的服务状态。 Stop-Service
cmdlet确实等待服务停止,但可能存在服务停止时间过长并且cmdlet失效或者其中有-nowait
开关的极端情况。如果需要,还会重新启动某些服务,因此可能需要进一步检查,如下所示(如果服务没有停止):
Stop-Service $servicename
$sleep=0
$s="Running"
do {
$sleep++
start-sleep 1
$s=(get-service $servicename).status
} while (($s -ne "Stopped") -and ($sleep -le 20))