Windows Powershell-关于软件发行版-如何在不重新启动软件的情况下杀死无法杀死的进程

问题描述

我遇到了一系列问题,这些问题本身并不独特,但总的来说是非常独特的。我有一系列的帮助程序控制台应用程序(C#),它们可以完成各种操作,例如连接和修改SSAS数据库,访问外部API等。这些是定期从sql Agent作业中调用的。

有时,由于某些完全未知的原因,这些控制台应用程序之一将变得无响应,这可能会导致sql代理锁定,或者它可能继续运行,但您将无法重新启动服务,它会放弃该进程,以至于该进程正在运行但不执行任何操作,它不会消耗cpu周期,也不会使用大量内存,但是它是“无法杀死的”,即您无法从任务管理器或任何其他方式。看起来像这样:

enter image description here

这些可以堆叠,有时您会在一个盒子上有多个无响应的进程。清除此混乱的唯一方法是重新启动服务器。我有tried so many ways of killing the process(s),但没有成功。

这会给我的自动发布过程造成严重问题,会定期更新我的控制台应用程序,发生这种情况并且存在此问题时,当您尝试将设置了覆盖标志的应用复制到应用程序的文件夹时,会得到以下内容变为真实(在这种情况下为Robocopy,但您可以想象这也是任何其他工具中的问题):

2020-10-23T18:24:36.9534370Z 2020/10/23 13:24:36错误32(0x00000020) 复制文件 XXX \ Autofac.dll 2020-10-23T18:24:36.9535263Z该进程无法访问文件 因为它正在被另一个进程使用。

要再次解决,则需要使用advise of @FakeName here,然后手动重启服务器并重新运行发行版,这是一个很大的麻烦。 我想做的是找到一种方法,通过Powershell以编程方式杀死“无法处理”的进程而无需重新启动计算机。

当您开始寻找实现此目标的方法时,您很快就会发现关于这一点有一些矛盾的说法。前"Raymon Chen" of Microsoft states

因此,用户可以杀死他们想要的任何进程(具有足够的特权), 他们可以阻止任何程序窃取焦点,并且可以删除任何程序 他们想要的文件(再次,具有足够的特权)。

@ralphtheninja states与与此密切相关的question类似。但是,如果您进行更深入的研究,您会发现有许多(虽然不是官方支持的)或100%傻瓜式的to create a unkillable process方法。 “不可处理的过程”的最流行和最经常提及的原因是buggy driver code的问题。由于我没有使用我所知道的任何驱动程序,并且在不同的服务器和Windows版本之间都看到了此问题,并且在执行各种不同操作的多个控制台应用程序中看到了此问题,因此我相信这些都不是方法或解释与我的问题有关。

如果我退后一步,看看Windows中“过程”的整个概念,在我看来,这种类型的问题更多与缺乏明确的方向以及Microsoft和其他公司的一致声明有关与流程管理有关的各方总结:

  1. 尚不清楚具有“完全”访问权限的管理员是否应该 允许杀死所有人(我的意思是说这个“全部”字面意思,不是 一个隐喻)通过powershell(或任何其他方法,例如 作为任务管理器)。

  2. 尚不清楚应该/可以在Powershell或UI中使用哪个命令/方法终止任务(由 third party tools用户界面中的扩散以及各种方式 via CMD or powershell),显然首选“停止处理”, “停止进程” clearly doesn't kill "All" processes

  3. 目前尚不清楚应该/不能终止任务的原因,如何解决这些原因以及对于我们中那些不发展的人 窗口设备驱动程序(而不是诸如"reboot your system"之类的笼统声明)如何诊断和确定导致我们开发的应用程序在Windows中变得“无法使用”的根本原因。

我尚未找到(经过大量研究):

  • 一个流程变得不可杀死的单一原因或原因列表。

  • 有关诊断此类问题的权威指南(在 C#或任何其他语言,不包括驱动程序专用的指南 开发)。

  • 了解杀死进程的不同方式的指南,不仅说明社区(堆栈及其他)如何为什么如此 做同一件事的许多不同方式,最重要的是 为什么为什么每种不同的方法都不能在特定过程中使用。

在每个软件发布此问题的唯一解决方案之前,是否正在重新启动服务器(或其他一些与过程无关的替代方法)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)