Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。
想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
3年前关闭。
Improve this question
在上面,我使用ps命令来知道上述情况下java进程的pid是7342。
然后,我使用kill命令杀死了该进程。
但这并没有被杀死,因为ps命令再次显示了pid为7342的java进程。
我是否应该使用其他命令来终止进程,以及为什么kill无法终止该进程
谢谢
想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
3年前关闭。
Improve this question
server01:/# ps -ax | grep java
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
7342 pts/3 Z 0:00 [java] <defunct>
7404 pts/3 S+ 0:00 grep java
server01:/# kill 7342
server01:/# ps -ax | grep java
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
7342 pts/3 Z 0:00 [java] <defunct>
7406 pts/3 S+ 0:00 grep java
server01:/#
在上面,我使用ps命令来知道上述情况下java进程的pid是7342。
然后,我使用kill命令杀死了该进程。
但这并没有被杀死,因为ps命令再次显示了pid为7342的java进程。
我是否应该使用其他命令来终止进程,以及为什么kill无法终止该进程
谢谢
最佳答案
Linux支持将BSD样式切换到ps
命令(不带前导-...破折号/连字符)。如果提供一个hypen,那么ps
的GNU coreutils版本(在主流Linux发行版中是标准版本)将尝试将这些开关解释为与SysV兼容。这是您的错误的根源。
我建议使用BSD形式的开关,并查找-o
选项以指定仅由匹配进程的PID组成的输出格式。
另外,您正在尝试杀死僵尸。如您所知,这是徒劳的。僵尸是进程中的占位符,能够处理已经死掉的进程。它保留在进程表中,直到其父进程“获取”其退出代码为止。如果父级从未执行过wait()
系统调用,则该条目将保留在那里,直到父级被杀死之后,此时init
进程将继承僵尸(以及任何其他孤立进程)。 Linux(或任何其他形式的UNIX)下的常规init
会定期收割所有无效的进程(僵尸)。
从概念上讲,在UNIX/Linux系统上退出的每个进程都花费少量时间作为“僵尸”……也就是说,在进程终止与其他进程读取其退出的时间之间应该始终有一段时间值(即使只是丢弃它,就像init
一样)。
这个问题确实应该在ServerFault上进行