美文网首页
kill不掉的僵尸进程~~

kill不掉的僵尸进程~~

作者: 名字是乱打的 | 来源:发表于2021-10-06 20:14 被阅读0次

    看到一个有意思的名字“僵尸进程”,然后看了下他的含义

    百度百科:僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源

    一 .如何杀死僵尸进程

    对于我们开发人员来说有问题要先解决了再说,怎么杀死僵尸进程呢。
    1、ps -aux,看看哪个进程STAT为Z,哪个就是僵尸进程


    2、ps -ef |grep 僵尸进程ID (第三列的PPID就是父id)或者pstree -aps 僵尸进程id 查看进程树关系,找到父进程ID,然后先杀死父进程即可

    二 .怎样来清除僵尸进程

    • 1.改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后, 会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略, 如果想响应这个消息,可以设置一个处理函数。
    • 2.把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程,关机或重启后所有僵尸进程都会消失。

    三 .如何避免僵尸进程

    僵尸进程的避免

    • ⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
    • ⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父进程会收到该信号,可以在handler中调用wait回收。
    • ⒊ 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD,SIG_IGN) 通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送信号。
    • ⒋ 还有一些技巧,就是fork两次;
      APUE上的fork两次的做法,是针对父进程fork有限次后终止的简单情况。父进程A专门fork一个子进程B,然后这个子进程fork创建N个子进程(不调用wait,所以会变成僵尸进程)后终止。子进程终止后,这N个僵尸进程失去了父进程B,所以成为了孤儿进程,被init进程收养,从而寿终正寝。这种做法本质还是和我之前的实验中手动kill父进程一样。

    相关文章

      网友评论

          本文标题:kill不掉的僵尸进程~~

          本文链接:https://www.haomeiwen.com/subject/ojmdnltx.html