僵尸进程详解

来源:互联网 发布:阿里云香港主机建立ss 编辑:程序博客网 时间:2024/06/06 01:54

僵尸进程简介

“僵尸”进程是什么?通常情况下,造成僵尸进程的成因是因为该进程本应该已经执行完毕,但是该进程的父进程却无法完整的将该进程结束掉,而造成该进程一直存在于内存中。

那么如何查看一个进程是否为僵尸进程呢?

ps:将某个时间点的进程运行状态选取下来ps aux    //查看系统所有的进程数据-A:所有的进程均显示出来-a:不与terminal有关的所有进程-u:有效用户相关的进程-x:通常与a一起使用,可以列出较完整的信息-l:较长、较详细地将该PID的信息列出

如图:
这里写图片描述

如上图

1、 F:进程标志,说明这个进程的权限,常见号码有:
若为4则代表权限为root
若为1则代表仅可被复制(fork),而无法实际执行(exec)
2、S:代表进程的状态
R ( Running):正在运行的进程
S(Sleeping):正在睡眠的进程,但可被唤醒
D:不可被唤醒的睡眠状态,一般都是在进行数据的I/O
T:停止状态
Z(Zombie):僵尸状态,进程已经终止但却无法被删除至内存外

也可以通过top指令来查看是否存在僵尸进程

top:动态查看进程的变化top:参数-d:后面接秒数,表示显示整个进程界面更新的秒数,如top -d 5-b:以批次的方式执行top-n:与-b搭配,意思是需要几次top输出的结果-p:指定某个特定的PID进行检测

如图:
这里写图片描述

光标处即目前的僵尸进程数量。


举例

这是一个维持30秒的僵尸进程

#include<stdlib.h>#include<stdio.h>int main(int argc,char** argv[]){    int id = fork();    if(id>0)    {        printf("Parent is sleeping\n");        sleep(30);    }    if(id == 0)    printf("Child process is done\n");    exit(EXIT_SUCCESS);}

通俗一点,僵尸进程就是指子进程先于父进程挂掉 但是父进程并没有正确回收子进程的资源而已。


进程的管理

当你获知它是一个僵尸进程后,那么你该如何干掉它呢,那么首先就得了解一下进程的管理。

程序之间的相互管理,是通过给予一个信号来进行管理的

查看信号(signal):
1、man 7 signal
2、kill -l

这里写图片描述

通常情况下,我们只需记住几个特别重要的信号即可。
1:启动被终止的进程,可让该PID重新读取自己的配置文件
9:强制中段一个进程,如果该进程运行到一半(如vim)会产生.filename.swap的半产品文件
15:正常结束一个进程
18:继续运行该进程
19:暂停一个进程

例如,强行杀掉一个进程:
这里写图片描述
在实际情况下,如果我们有时无法直接杀掉一个僵尸进程,可以找到其父进程将其杀掉,从而干掉该僵尸进程。


总的来说,当系统不稳定时,或者代码不够完善,亦或是用户操作不当都可能产生僵尸进程,而僵尸进程是1个早已死亡的进程,但在进程表(processs table)中仍占了1个位置(slot)。由于进程表的容量是有限的,所以就占用了内存资源,影响系统性能。

2 0
原创粉丝点击