0

好吧,这几天断断续续地困扰着我。我在一个客户站点,他们有许多定制的、内部编写的、在 Windows 2008R2 IIS 服务器上运行的服务。问题是其中一些服务一直挂起,它们被困在“停止”状态,杀死它们的唯一方法是打开进程资源管理器并杀死线程。在任何人谈论使用“runas”,或以本地管理员或服务所有者身份登录之前,我们已经经历了所有这些。

问题在于可执行文件本身。另一个国家的开发团队将对此进行研究,但至少需要 4-5 个月,我们不确定他们是否会做对。

我有一个 Powershell 脚本来定期检查服务,它能够确保服务正在运行,如果没有,则强制停止并重新启动服务,然后它会发送一封电子邮件以确认操作。但是,对于提到的这些特定服务,它无能为力。它们不能在任务管理器、taskkill 或进程资源管理器中被杀死(除非有人杀死线程)它只是说访问被拒绝。可以在进程资源管理器中更改权限并将其终止,但这是一个比终止线程更长的过程。

为了让事情变得更加困难,我不能使用进程名称,因为在这台服务器上还有另外两个网站使用同名的 exe,只是在不同的文件夹中。我所追求的是一种找到并杀死进程ID的线程的方法,我已经通过我的脚本获得了这个,所以脚本的其余部分可以完成重新启动所述服务的任务。目前该服务在整个白天和晚上都以不一致的方式死亡,支持人员必须 RDP 到服务器上,打开进程资源管理器,找到有问题的进程并杀死线程然后重新启动服务。对于这些已经过度工作的人来说有点麻烦,特别是如果我们可以让 powershell 自动完成。

希望有人可以在这方面提供帮助。提前致谢。

4

1 回答 1

1

低级线程处理可能需要使用本机 Win32 API。Powershell 可能对 P/Invoke 有所帮助,但过程会很复杂。对于初学者,请了解是否可以使用以下工具来识别卡住的线程。也许您可以将此信息与一些 Sysinternals 工具(如 handle.exe)结合起来,找出真正阻塞线程的原因。

.Net 框架有一些通过System.Diagnostics.Process命名空间可用的工具。命名进程的线程列表可用,如下所示,

$ps = [diagnostics.process]::getProcessesByName("iexplore")
$p = $ps[0]
$p.Threads[0]

完整的文档在 MSDN 中。没有杀死线程的方法,但这应该是识别被卡线程的起点。

另一种方法是使用 WMI 来获取win32_thread数据,如下所示,

$threads = gwmi win32_thread

输出完全不同,需要进行一些过滤。一些例子是可用的。另一个 WMI 解决方案尝试可能基于具有方法的Win32_process 。Terminate

于 2014-01-22T10:33:49.637 回答