我们有一个运行在Mac OS X上的Java服务器应用程序。
有时这个应用程序已经变得没有反应,我们用kill -9来杀死它。 但是,这个过程并没有消失。 它仍然出现在ps ,在其名称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)
更重要的是服务器使用的端口仍然是绑定的:
$ netstat -na | grep 9902 tcp4 0 0 *.9902 *.* LISTEN
即使它对lsof不可见:
$ sudo lsof -P -i tcp | grep 9902 $
在端口仍然绑定的情况下,我们无法重新启动服务器应用程序。 没有重新启动机器,可以做什么来获得端口释放,并让这个过程真的被杀死?
你的过程正在等待一些东西,然后才能退出。
也许是一个系统调用。 尝试访问已卸载的文件是一个常见的例子,或者一个不可用的networking共享。
是否有父母或子女的过程也需要被杀害?
我不是一个MacOS用户,但在Linux ps wwauxf | less 浏览stream程层次结构以查找父进程和subprocess的次数会减less。 strace -p [pid]可能会告诉你一些有关当前尚未返回的系统调用的信息。
–
编辑:你的进程是由launchd启动的? 似乎有一些人有问题(例如如何杀死OS X(state = E)上的“退出”进程 ),如上所述,您可能需要杀死在这种情况下启动的父进程。 这可能不如重启。
想必launchd保持连接到您的应用程序,以便重新启动,如果它死了,但这并不是那么有用。
杀了-15还好吗? 即在你进入你所描述的状态之前,而不是一个出路。
E国似乎意味着这一进程正在退出。 但是你的过程基本上是一个永远不会退出的僵尸。 我在网上find的所有东西都显示除了重新启动之外,你可以做的事情很less,例如, 如何杀死OS X上的“退出”进程(state = E) 。 如果由于其他服务受到影响而不想重新启动OSX服务器,则可以考虑(作为解决方法):
将此Java服务迁移到单独的OSX机器,您可以在需要时重新启动,影响最小
如果你在这个服务器上有足够的内存,你可以创build一个虚拟机,并在虚拟机内运行这个服务。 如果进程无响应并且不会被杀死,那么您可以反弹虚拟机而不会影响主机操作系统。 由于它看起来像Java,所以您不一定非要制作来宾虚拟机OSX。 也许尝试在Ubuntu或CentOS的VM? 您可以将它们中的任何一个作为设备(OVA / VDI文件)下载并在30分钟内在VirtualBox中运行。 甚至可能在Linux虚拟机上没有僵尸问题。 请参阅http://virtualboximages.com/Free.VirtualBox.VDI.Downloads