问题在于可执行文件本身。在另一个国家的开发团队将会考虑这个问题,但最少需要4-5个月,我们不确定他们是否能够做到这一点。
我有一个Powershell脚本来定期检查服务,该服务能够确保服务正在运行,如果没有,则强制停止并重新启动服务,然后发送电子邮件以确认操作。但是,提到这些特定服务它无能为力。它们不能在任务管理器,taskkill或进程资源管理器中被杀死(除非有人杀死线程)它只是说访问被拒绝。可以在进程资源管理器中更改权限并终止它,但这比杀死线程更长。
为了使事情变得更加困难,我无法使用进程名称,因为在此服务器上有两个其他网站使用具有相同名称的exe,只是在不同的文件夹中。 我所追求的是一种查找和终止processID线程的方法,我已经通过我自己的脚本获取了该线程,因此脚本的其余部分可以完成重启所述服务的任务。目前,这项服务在整个白天和晚上以不一致的方式死亡,并且支持人员必须将RDP放到服务器上,打开进程资源管理器,找到有问题的进程并终止线程然后重新启动服务。对于这些已经过度工作的人来说有点麻烦,特别是如果我们可以让powershell自动完成它。
希望有人可以帮忙解决这个问题。提前谢谢。
答案 0 :(得分:1)
低级线程处理可能需要本机Win32 API使用。 Powershell可能对P / Invoke有所帮助,但这个过程将变得复杂。对于初学者,请确定是否可以使用以下工具来识别卡住的线程。也许你可以将这些信息与一些像sys.exe这样的Sysinternals工具结合起来,找出真正阻塞线程的内容。
.Net框架通过System.Diagnostics.Process
命名空间提供了一些工具。可以使用命名流程的线程列表,
$ps = [diagnostics.process]::getProcessesByName("iexplore")
$p = $ps[0]
$p.Threads[0]
完整documentation位于MSDN中。没有杀死线程的方法,但这应该是识别卡住线程的起点。
另一种方法是使用WMI来获取win32_thread这样的数据,
$threads = gwmi win32_thread
输出完全不同,需要进行一些过滤。一些例子are available。另一个WMI解决方案尝试可能基于具有Terminate
方法的Win32_process。