我有一台运行 NSClient++ 的 Windows 2008R2 服务器。由于某种原因,该服务出现问题并停止响应 Nagios 轮询。
当我尝试重新启动服务时,服务管理器花了很长时间尝试终止服务,最后放弃并显示一条消息,内容是“服务响应时间过长”。但是...它还会启动该服务的一个新实例。
如果我查看任务管理器,tasklist
我现在可以看到两个nsclient++.exe
正在运行的实例。
我尝试使用以下方法来杀死它们:
在任务管理器中右键单击并“结束进程” - 假装终止进程并且不报告任何错误(例如拒绝访问)但进程仍然存在。
taskkill /PID <proc id> /F
- 报告SUCCESS: The process with PID 6672 has been terminated.
但进程仍在运行。下载了 SysInternals PsTools 并运行
pskill <PID>
- 报告Process <PID> killed
- 但进程仍然存在。执行
at hh:mm pskill <PID>
以pskill
作为帐户执行此操作SYSTEM
...并且您猜测该过程仍在运行。
以上所有操作均在管理员命令提示符下运行。
除了不太理想的重新启动(该盒子是一个相当关键的生产服务器)之外,我还能尝试什么?
服务器没有承受任何资源压力(内存、CPU、磁盘等),并且其上运行的一切都运行良好。
快速查看 SysInternals Process Explorer 中的线程选项卡可发现,所有这些nsclient++.exe
实例都卡在卸载状态:
另外,我还尝试过(使用 TCPView)终止这些僵尸进程的所有 TCP 连接,希望能够启动一个新实例,并且能够获取端口 5666。然后,我们可以在一切平静下来时重新启动服务器,但遗憾的是,这没有奏效。
答案1
尽管您似乎已经解决了这个问题,但问题在于该进程正在等待内核的某些操作。(这通常是驱动程序级别的问题,但并非总是如此。)终止此类进程的唯一方法是卸载内核,当然,这需要重新启动才能完成。
可能值得尝试一些内核调试(此工具在 2008 R2 上可用吗?)希望缩小具体原因或冲突的范围,但处理问题的选项要么是忍受它,要么是重新启动服务器来消除它。
您没有考虑过忍受它的原因是什么?如果它只是一个僵尸进程,并且它没有影响任何东西,我认为您可以推迟重新启动,直到维护窗口或更合适的时间。通常我的做法是,当僵尸或挂起进程没有干扰任何事情时 - 在下一个补丁周期或计划的维护窗口中处理它。