其他分享
首页 > 其他分享> > 关于强制停止服务的问题

关于强制停止服务的问题

作者:互联网

强制停止服务

当停止某个服务的时候,因为某些为止的原因,服务的状态会一直处于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这样的)是共享一个进程的

解决办法

  1. 重启
  2. 杀掉共享进程前,保存其他running的service,然后重启这些service(造成波动)
  3. 待研究

标签:服务,service,Get,Winrm,停止,kill,强制
来源: https://www.cnblogs.com/talentzemin/p/16545243.html