zoukankan      html  css  js  c++  java
  • 僵尸进程的清除

    僵尸进程的清理
    僵尸进程的清理方法还是很简单的,不过我们先回顾一下基础概念
    僵尸进程:一个父进程利用fork创建子进程,如果子进程退出,而父进程没有利用wait方法或者waitpid方法来获取子进程的状态信息,那么子进程的状态依然保存在系统中。
    与之对应的就是孤儿进程:一个父进程退出, 而它的一个或几个子进程仍然还在运行,那么这些子进程就会变成孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集的工作

    所以说孤儿进程最后会被系统的老祖宗init 1进程来收养,但是僵尸进程则不然,他一直保存在系统里面并占用系统的资源。所以一旦出现大量的僵尸进程,我们势必要解决掉才可以。
    最简单的方法就是重启系统,但是太low了。下面介绍一个方法:
    1、使用top发现僵尸进程

    root@aaa:~ # top
    last pid: 27676;  load averages:  0.83,  0.78,  0.70      
    103 processes: 1 running, 101 sleeping, 1 zombie
    CPU:  0.2% user,  0.0% nice,  1.1% system,  0.0% interrupt, 98.7% idle
    

    此时发现一个僵尸进程
    2、找到该僵尸进程

    root@freenas:~ # ps aux | grep defunct | grep -v grep
    root       52405    0.0  0.0      0      0  -  Z    21Sep20       0:00.00 <defunct>
    

    第二列就是该僵尸进程的pid号,
    3、找到其该僵尸进程的父进程的pid号,即ppid

    root@freenas:~ # ps axjf | grep defunct | grep -v grep
    USER            PID  PPID  PGID   SID JOBC STAT TT           TIME COMMAND
    root          52405 52403  5107  5107    0 Z     -        0:00.00 <defunct>
    

    可以看到父进程pid号是52403。
    我们看看这个父进程是干什么的

    root@freenas:~ # ps aux | grep -v grep | grep 52403
    root       52403    0.0  0.0  13040   2496  -  I    21Sep20       0:00.00 /usr/bin/bc
    

    原来是一个bc程序,kill掉
    4、kill掉其父进程
    kill掉父进程的目的就是让这个僵尸进程变成孤儿进程,进而被系统的init进程来收养,达到清理僵尸进程的目的

    root@freenas:~ # kill -9 52403
    

    ok了,问题解决。
    想根本解决僵尸进程的问题,那么需要从程序的角度出发来优化代码才可以。

  • 相关阅读:
    iOSIPV6简单测试环境搭建
    SQL存儲過程的調試方法
    Excel的 OleDb 连接串的格式
    RequiredFieldValidator的使用
    GridView導出Excel
    咳嗽對症下藥
    WCF基礎
    WCF配置文件全攻略
    WCF寄宿方式
    WCF綁定
  • 原文地址:https://www.cnblogs.com/FengGeBlog/p/13926958.html
Copyright © 2011-2022 走看看