kill -9 can't kill

 kill -9发送SIGKILL信号将其终止,但是以下两种情况不起作用:
a、该进程处于"Zombie"状态(使用ps命令返回defunct的进程)。此时进程已经释放所有资源,但还未得到其父进程的确认。"Zombie"进程要等到下次重启时才会消失,但它的存在不会影响系统性能。

b、 该进程处于"kernel mode"(核心态)且在等待不可获得的资源。处于核心态的进程忽略所有信号处理,因此对于这些一直处于核心态的进程只能通过重启系统实现。进程在AIX 中会处于两种状态,即用户态和核心态。只有处于用户态的进程才可以用“kill”命令将其终止  

------------------------------------------------------------------------------------------------------------------------------------------------------------------

父进程在fork出子进程后,如果子进程死了,父进程没有给它收尸,就会产生僵尸进程。要杀死僵尸进程,只有两个办法:


1、改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。


2、把父进程杀掉。父进程死后,它产生的所有僵尸进程也跟着消失。




以solaris为例:




// 在父进程中接管SIGCHLD信号
    newact.sa_handler = Quit&#59;
    newact.sa_flags   = 0&#59;
    newact.sa_handler = WaitChld&#59;// WaitChld为SIGCHLD信号处理函数名
    sigemptyset(&newact.sa_mask)&#59;
    sigaction(SIGCHLD, &newact, NULL)&#59;






// WaitChld函数


void WaitChld(int sig)
{
    char    szRtnMsg[128]&#59;
    int     status, chld_term_sig&#59;
    pid_t   pid&#59;


    pid = waitpid(0, &status, WNOHANG)&#59;


    if (WIFEXITED(status) != 0)     // 子进程正常退出
        return&#59;


    strcpy(szRtnMsg, "子进程异常终止"&#59;


    chld_term_sig = WTERMSIG(status)&#59;
    switch (chld_term_sig) {
    case SIGILL:
    case SIGTRAP:
    case SIGABRT:
    //case SIGEMT:
    case SIGFPE:
    case SIGBUS:
    case SIGSEGV:
    //case SIGSYS:
    case SIGXCPU:
        strcat(szRtnMsg, "(CoreDumped)"&#59;
        break&#59;


    case SIGQUIT:
    case SIGKILL:
    case SIGTERM:
        strcat(szRtnMsg, "(Killed)"&#59;
        break&#59;


    default:
        break&#59;
    }
}




Reference:

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=717264&highlight=
http://englishman2008.blog.163.com/blog/static/2801290720121016113225986/
https://blogs.oracle.com/haifeng/entry/unix_%E5%83%B5%E6%AD%BB_zombie_%E8%BF%9B%E7%A8%8B1
http://www.jb51.net/os/Solaris/1631_2.html preap (Solaris >= 9):除去僵尸进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值