关于强制停止服务的问题
作者:互联网
强制停止服务
当停止某个服务的时候,因为某些为止的原因,服务的状态会一直处于STOP_PENDING,此时,就需要强制停止该服务
杀死服务对应的进程
用中文在百度搜索“杀死服务”,以及用英文在google搜索“kill service”,基本原理都一样:
找到目标服务的进程ID---PID,然后杀死即可
CMD命令
sc queryex servicename
taskkill /f /pid [PID]
PowerShell
$processId = Get-CimInstance -Class win32_service | ?{$_.Name -eq "YOURSERVICENAME"} | select -ExpandProperty ProcessId
kill $processId
如果我们要杀的是系统服务呢?
在我们的场景中,Winrm服务因为某些原因无法停止,于是我们就copy-paste以上代码去处理,结果引发了新的问题---无法访问网络路径。
简单来说,本来同一个域的server,是可以通过SMB协议访问,访问路径类似这样:\ServerName\C$\Windows。结果在杀死Winrm服务之后,无法访问了。
为什么呢?难道误杀了不成?
执行以下代码用于验证,是否其他服务也收到影响
Get-Service
"before kill"
$winrmSvc = Get-CimInstance -ClassName win32_service | ?{$_.Name -eq "winrm"}
$winrmPID = $winrmSvc.ProcessId
Stop-Process -Id $winrmPID -Force
"after kill"
Get-Service
结果:
WHAT?
除了Winrm服务停止之后,还有其他3个服务也被停止了。
这3个服务看样子并没有与Winrm有啥关系。
影响我们访问网络路径的服务是LanmanWorkstation
(试的)
启动该服务后,另外2个服务也自动启动了。
为什么会停止其他服务?
Winrm服务和LanmanWorkstation服务有啥关系?
经过一番查证,发现二者关系就如卡巴斯基和巴基斯坦的关系。
点开瞧瞧
WHAT?
为啥binPath一毛一样?参数还一样?
是不是就是因为他们是同一个进程,所以就给一并杀了?
binPath一毛一样的还有其他服务,不管进程执行的Command Line一样,ProcessID还一样!
多个service,共用一个进程(ID)!!!
为啥?问就是为了节约资源
Svchost.exe (Service Host, or SvcHost) is a system process that can host from one or more Windows services in the Windows NT family of operating systems.[1] Svchost is essential in the implementation of shared service processes, where a number of services can share a process in order to reduce resource consumption.
https://en.wikipedia.org/wiki/Svchost.exe
经过验证,发现在客户机上(win10这样的)没有这样的情况
而在服务器上(windows server 2012 R2这样的)是共享一个进程的
解决办法
- 重启
- 杀掉共享进程前,保存其他running的service,然后重启这些service(造成波动)
- 待研究
标签:服务,service,Get,Winrm,停止,kill,强制 来源: https://www.cnblogs.com/talentzemin/p/16545243.html