kill -9 进程不会消失并且端口仍然绑定

Rob*_*eck 5 java port mac-osx kill netstat

我们有一个在 Mac OS X 上运行的 Java 服务器应用程序。

有时这个应用程序变得没有响应,我们不得不使用kill -9. 然而,这个过程并没有消失;它似乎仍然是ps,其名称周围带有括号,并且 STAT 列中有一个问号:

$ ps u -p 776
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
camadmin   776   0.0  0.0        0      0   ??  ?E    5:12PM   0:00.00 (java)
Run Code Online (Sandbox Code Playgroud)

更重要的是,服务器正在使用的端口仍然是绑定的:

$ netstat -na | grep 9902
tcp4       0      0  *.9902      *.*                    LISTEN
Run Code Online (Sandbox Code Playgroud)

即使它不可见lsof

$ sudo lsof -P -i tcp | grep 9902
$
Run Code Online (Sandbox Code Playgroud)

由于端口仍然绑定,我们无法重新启动服务器应用程序。没有重新启动机器,可以做些什么来释放端口并真正杀死这个进程?

Jos*_*ber 1

状态E似乎意味着进程正在退出。但你的进程基本上是一个永远不会退出的僵尸。我在网上发现的所有内容都表明,除了重新启动之外,您几乎无能为力,例如How to Kill an "exiting" process on OS X (state = E)。如果由于其他服务受到影响而不想重新启动 OSX 服务器,您可以考虑(作为解决方法):

  • 仅将此 java 服务迁移到单独的 OSX 计算机,您可以在需要时重新启动,影响最小

  • 如果该服务器上有足够的 RAM,您可以创建一个虚拟机并从虚拟机内部运行该服务。如果进程变得无响应并且不会被终止,您可以只是弹回虚拟机而不会影响主机操作系统。由于它看起来像 Java,因此您不必将来宾 VM 创建为 OSX。也许可以在 Ubuntu 或 CentOS VM 中尝试一下?您可以将其中任何一个下载为设备(OVA/VDI 文件),并在 30 分钟内将其安装并在 VirtualBox 中运行。Linux 虚拟机上甚至可能没有僵尸问题。请参阅http://virtualboximages.com/Free.VirtualBox.VDI.Downloads