我有一个僵尸进程拒绝删除,尝试过killall -9 1913和pkill但没有效果。任何帮助将非常感激。运行 Ubuntu 12.04.2 LTS。谢谢。
aruna@aruna-desktop:~$ ps -aux | grep Z
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
aruna 1913 0.0 0.0 0 0 ? Z 12:07 0:00 [lightdm-session] <defunct>
答案1
看起来这个僵尸进程的根本原因是所描述的错误这里。
您无法杀死僵尸进程,因为您可以使用 SIGKILL 信号杀死正常进程 - 僵尸进程已经死亡。请记住,除非系统上有大量僵尸进程,否则您不需要摆脱僵尸进程 - 一些僵尸进程是无害的。但是,有几种方法可以消除僵尸进程。
一种方法是向父进程发送 SIGCHLD 信号。该信号告诉父进程执行 wait() 系统调用并清理其僵尸子进程。使用kill命令发送信号,将下面命令中的pid替换为父进程的PID:
杀死 -s SIGCHLD pid
但是,如果父进程未正确编程并且忽略 SIGCHLD 信号,则这将无济于事。你必须杀死或关闭僵尸的父进程。当创建僵尸进程结束时,init 继承僵尸进程并成为它们的新父进程。 (init 是 Linux 上启动时启动的第一个进程,分配的 PID 为 1。) init 定期执行 wait() 系统调用来清理其僵尸子进程,因此 init 可以快速处理僵尸进程。关闭父进程后可以重新启动它。
如果父进程继续创建僵尸进程,则应对其进行修复,以便它正确调用 wait() 来获取其僵尸子进程。如果系统上的程序不断创建僵尸程序,请提交错误报告。
l
当您使用选项ps
时,您可以找到父进程ID ps -l
,它将显示在PID
,子进程将显示在PPID
您还可以使用pstree
命令查看进程树。
答案2
好吧,在我用谷歌搜索之前我会说“你不能这样做”这个计算器问题。看来您可以使用来gdb
调用waitpid()
系统调用父进程僵尸进程。好技巧。
我的建议是不要这样做:无论“lightdm”是什么,它可能会经常在退出子进程后进行清理,或者它可能会假设它会清理。如果你waitpid()
这样做gdb
,你可能会被浇水lightdm
。