什么是PowerShell的Stop-Service和NET-STOP之间的区别

时间:2017-11-21 04:18:32

标签: powershell

在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-ServiceNET STOP都会产生相同的结果吗?或者它们之间是否有差异可以解释为什么遗留的似乎更可靠?

2 个答案:

答案 0 :(得分:5)

对于以下的Windows服务:

  • 目前正在运行
  • 原则上可以停止

net stopStop-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-ServiceStart-Service源代码:

GitHub上的公开源代码适用于PowerShell的跨平台 Core 版本,但看起来有问题的代码基本上是从 Windows 中未经修改的PowerShell版本。

[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))