我有一个运行 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
- 但该过程仍然存在。execute
at hh:mm pskill <PID>
以帐户pskill
身份执行此操作SYSTEM
...您猜对了,该过程仍在运行。
以上所有都是在管理员命令提示符下运行的。
除了不太理想的重启(该盒子是一个相当关键的生产服务器)之外,我还能尝试什么?
服务器没有任何资源压力(内存、CPU、磁盘等),并且在其上运行的所有内容都运行良好。
快速查看 SysInternals Process Explorer 中的线程选项卡显示所有这些nsclient++.exe
实例都卡在卸载中:
顺便说一句,我还尝试杀死这些僵尸(?)进程(使用 TCPView)的所有 TCP 连接,希望我可以启动一个新实例并且它能够获取端口 5666。然后我们可以重新启动服务器当事情变得更安静时,可惜那没有用。
尽管看起来您已经解决了这个问题,但问题是该进程正在等待内核进行某些操作。(这通常是驱动程序级别的问题,但并非总是如此。)终止此类进程的唯一方法是卸载内核,当然,如果不重新启动就无法执行此操作。
可能值得尝试一些内核调试(此工具在 2008 R2 上工作吗?)以期缩小具体原因或冲突的范围,但您处理问题的选择要么忍受它,要么重新启动服务器以消除它。
你有没有考虑过忍受它的原因?如果它只是一个僵尸进程,并且没有影响任何东西,我认为您可以推迟重新启动,直到维护窗口或更合适的时间。通常我的方法是,当僵尸或挂起的进程没有干扰任何东西时——在下一个补丁周期或计划的维护窗口中处理它。