`

有关defunct进程(僵尸进程)的处理原则

阅读更多
僵尸进程:就是已经结束了的进程,但是没有从进程表中删除。太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。
僵尸进程的查看:
ps -ef
出现:
root     13028 12956 0 10:51 pts/2    00:00:00 [ls] <defunct>
最后有defunct的标记,就表明是僵尸进程。

产生的原因:
每个Linux进程在进程表里都有一个进入点(entry),核心程序执行该进程时使用到的一切信息都存储在进入点。当用ps命令察看系统中的进程信息时,看到的就是进程表中的相关数据。当以fork()系统调用建立一个新的进程后,核心进程就会在进程表中给这个新进程分配一个进入点,然后将相关信息存储在该进入点所对应的进程表内。这些信息中有一项是其父进程的识别码。当这个进程走完了自己的生命周期后,它会执行exit()系统调用,此时原来进程表中的数据会被该进程的退出码(exit code)、执行时所用的CPU时间等数据所取代,这些数据会一直保留到系统将它传递给它的父进程为止。由此可见,defunct进程的出现时间是在子进程终止后,但是父进程尚未读取这些数据之前。

产生的例程:
#include "sys/types.h"
#include "sys/wait.h"

#include "stdio.h"
#include "unistd.h"

int main(int argc, char* argv[])
{
while(1)
{
    pid_t chi = fork();
    if(chi == 0)
    {
      execl("/bin/ls",NULL);
    }

    sleep(2);
}
}

对付这种的方法:
外部的方法:
执行pstree,看到:
     |-sshd-+-sshd---bash
     |      |-sshd---sftp-server
     |      `-sshd-+-bash---vi
     |             |-bash---myfork---2*[ls]
也就是主进程是myfork
将myfork干掉就可以了

编程的方法:
1、主进程等待子进程
#include "sys/types.h"
#include "sys/wait.h"

#include "stdio.h"
#include "unistd.h"

int main(int argc, char* argv[])
{
while(1)
{
    pid_t chi = fork();
    if(chi == 0)
    {
      execl("/bin/ls",NULL);
    }

    int status;
    wait(&status);
    sleep(2);
}
}

也就是加上了wait
2、在主进程里面补充对child 退出的signal的处理:
void sig_child(int signo){
       pid_t   pid;
       int   stat,i;
       while((pid = waitpid(-1, &stat, WNOHANG)) > 0);
       return;
}

      signal(SIGCHLD,sig_child);

分享到:
评论

相关推荐

    ccc013#Study-Notes#如何杀死defunct进程1

    参考文章如何杀死defunct进程(译)首先是通过下面的命令找到父进程的PID输出结果为:其中:如果你使用命令 “kill -9 40428” 尝试杀死 ID

    linux中的僵尸进程

    4. **PS命令显示**:使用`ps`命令查看进程时,僵尸进程会显示为“Z&lt;”或“defunct”。 #### 四、如何避免僵尸进程 为了避免僵尸进程的产生,可以通过以下几种方式: 1. **调用`wait`或`waitpid`函数**:父进程...

    python僵尸进程产生的原因

    在 unix 或 unix-like 的系统中,当一个子进程退出后,它就会变成一个僵尸进程,如果父进程没有通过 wait 系统调用来读取这个子进程的退出状态的话,这个子进程就会一直维持僵尸进程状态。 Zombie process – ...

    Linux下的进程状态

    7. **Z (Defunct or Zombie)**:僵尸状态。进程已经终止,但其父进程尚未调用`wait()`系统调用来清理子进程的资源。僵尸进程会占用一定的系统资源,但不消耗CPU时间。 #### 扩展状态标记 除了上述基本状态外,在...

    杀不死的进程

    不过需要注意的是,进程保活会带来一定的性能开销,因此在使用时需权衡利弊,并尽可能优化相关设计以减少不必要的资源消耗。此外,随着Android系统的不断升级和完善,开发者还需关注官方政策的变化,确保遵循最新的...

    DEFUNCT

    标题“DEFUNCT”可能指的是一个已经废弃或者不再使用的字体或者设计项目。在IT行业中,"DEFUNCT"这个词常用于描述某个软件、服务或项目已经停止维护、更新或废弃的状态。在这里,结合“字体”这一标签,我们可以推断...

    defunct:函数式辅助函数库

    $ npm install defunct 示例用法 var d = require ( 'defunct' ) ; it ( 'should be able to multiply' , function ( t ) { var mul = d . mul ( 10 ) ; t . equal ( mul ( 5 ) , 50 , 'multiply' ) t . end ( )...

    Unix常用命令技巧

    - 上面的命令用于查找僵尸进程。 **2. 检查特定进程状态** - 可以通过循环遍历特定进程名来检查它们的状态。 ```bash PROC="BankServer|aibank BankClient|aibank tgmp|icbc" for i in $PROC do process_...

    flotilla-defunct:一个基本且可扩展的 Go web 框架

    总的来说,Flotilla-Defunct 虽然已不再活跃,但它展示了 Go 语言在构建 Web 框架时的一些核心原则和最佳实践。理解这些概念有助于我们在使用其他现代框架(如 Gin、Echo 或 Revel)时更好地掌握 Go Web 开发的精髓...

    Linux下Tomcat重新启动

    如果 Tomcat 已经关闭,这个命令将显示 Tomcat 的进程信息,但是状态将是 defunct。 最后,我们可以使用 ./startup.sh 命令来启动 Tomcat。这时,Tomcat 将重新启动,并开始监听端口。 需要注意的是,在重新启动 ...

    defunct-开源

    标题“defunct-开源”可能指的是一个已停止维护或废弃的开源项目。在IT行业中,开源软件是指源代码可以自由查看、使用、修改和分发的软件。这种类型的软件通常由社区驱动,开发者们共同协作以改进代码和添加新功能。...

    pubpatternsapi:PubPatterns REST API(DEFUNCT)

    开发者可以从中学到如何构建一个与出版行业相关的REST服务,了解如何处理DOI数据,以及如何使用Sinatra搭建和设计API。此外,分析废弃项目的原因也可以帮助我们理解技术演进和市场需求变化对项目的影响,这对于未来...

    engine-defunct:Engine 是驱动 Go web 框架的核心

    "Engine" 在这个上下文中是一个关键概念,它是许多 Go Web 框架的核心组成部分,负责处理请求、路由分发、上下文管理以及与 HTTP 状态相关的功能。本文将深入探讨 Engine 的核心功能及其在构建 Go Web 应用中的作用...

    [defunct] Chemical Resource Kit-开源

    【标题】"Chemical Resource Kit" 是一个曾经活跃但现在已停产的开源项目,专为合成化学家设计。...通过深入理解这些文件和源代码,用户可以从中获取到化学计算、建模和数据处理的知识,并可能启发新的科研方法或工具。

    defunct-template-scala-parallel-universal-recommendation

    它包含用于处理事件的高度灵活的机制,这些事件合并了用户整个点击流的任何重要部分。 它还可以几种方式混合基于内容的建议,以增强协作过滤并考虑重要的上下文。 它作为模板提供,以方便安装和应用程序集成。 该...

    TallyMan E-Commerce (defunct)-开源

    TallyMan在2000年被废弃。TallyMan是功能齐全的,高度可定制的商业和站点管理系统。 100%纯Perl / Embperl。

Global site tag (gtag.js) - Google Analytics