内容
提要 本文介绍了为什么会产生defunct进程,如何确定引起defunct进程的原因,以及当需要进一步确定问题时应提供何种信息给软件供应商。
正文 1.Defunct进程的产生
在AIX操作系统实施的进程结构中,每一个进程都有一个父进程。当一个进程结束时会通知它的父进程,从而该进程的父进程会收集该进程的状态信息。若父进程在一定的时间内无法收集到状态信息,则系统中就会残留一个defunct进程。
因为defunct进程是已经停止的,所以使用杀死进程的方法来杀defunct进程是无效的。defunct进程不使用CPU或硬盘等系统资源,而只使用极少量的内存用于存储退出状态和资源使用信息。
2.问题确定
某一个进程在结束时由它的父进程负责删除它。要找到某一个进程的父进程,执行ps -ef命令,输出中的PPID列给出了一个进程的父进程的进程号。
(1)如果PPID为1应该如何做?
如果一个defunct进程的PPID为1,则该defunct进程的父进程为init进程。init进程是系统中所有进程的起源。通常情况下,init进程通过将defunct进程的PPID设为1来收回该进程。
如果一个defunct进程的父进程号为1,则需要确认该defunct进程是否已结束了若干分钟。(方法是等几分钟后再查看该defunct进程是否还存在。)一个系统中,特别是任务繁忙的系统中,父进程为init的defunct进程存在1~2分钟是正常的。defunct进程经常由复杂的shell脚本程序产生,这种情况通常是正常的,并不能说明有问题存在。
当init进程没有处理完/etc/inittab文件而在等其中的某一项命令结束(通常是一个/etc/rc脚本)时,可能会发生问题。在这时候,init进程会忽略掉其它所有结束的子进程,而只等这个特定的子进程结束。由一个挂起的/etc/inittab文件中的任务引起的问题的征兆是:父进程为init的defunct进程无限制的增长。在AIX4.3及以后的版本中,init进程的功能被增强,用以有效地处理defunct进程。
如果/etc/inittab文件中含有类似下一行的项,则删除它:
install_assist:2:wait:/usr/lib/lpd/pio/etc/pioinit > /dev/null 2>&1
该进程会引起defunct进程。该项应在初始化安装结束后被自动删除。
(2)如果PPID不为1应该如何做?
如果父进程号不为1,则相应的父进程应负责收回结束的子进程。未收回子进程的原因之一是shell管道。系统中的许多命令都不会产生子进程,这些进程也无法处理那些结束的子进程。这种情况在一个shell管道中有一个或多个短时进程及一个和多个长时间进程时更为明显。一个defunct进程会在它的父进程运行期间一直存在。
任何一个程序在产生子进程时都应负责在子进程结束时收回它们。如果程序在编写中没有考虑到处理它们产生的子进程,则该程序存在问题。 3.如果需要对问题做进一步确认,如何做?
如果确认一个进程是defunct进程,并且该进程应该被它的父进程收回,则可能需要提供下面的信息给应用软件供应商用以分析问题产生的可能原因:
(1)下面命令的输出:
# ps -ef
(2)下面命令的输出:
# who -a
(3)/etc/inittab 文件
(4)下面命令的输出:
SLOT=`expr <PPID> / 256`
(echo u $SLOT ; echo trace -k $SLOT) | crash > <filename>
其中,<PPID>是defunct进程的父进程号,<filename> 是输出文件的文件名。