Linux系统中查杀僵尸进程方法介绍
来源:才华咖 本文已影响1.57W人
来源:才华咖 本文已影响1.57W人
在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程. 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程。
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是 使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)
进程的危害
由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 那么会不会因为父进程太忙来不及wait子进程,或者说不知道 子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNⅨ提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的.内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放. 但这样就导致了问题,如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
1、如何查看僵尸进程?
如何查看linux系统上的僵尸进程,如何统计有多少僵尸进程?
#ps -ef | grep defunct
或者查找状态为Z的进程,Z就是代表zombie process,僵尸进程的意思。
另外使用top命令查看时有一栏为S,如果状态为Z说明它就是僵尸进程。
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
top命令中也统计了僵尸进程。或者使用下面的命令:
ps -ef | grep defunct | grep -v grep | wc -l
2、如何杀死僵尸进程?
一般僵尸进程很难直接kill掉,不过您可以kill僵尸爸爸。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
ps -e -o ppid,stat | grep Z | cut –d” ” -f2 | xargs kill -9
或
kill -HUP `ps -A -ostat,ppid | grep -e ’^[Zz]‘ | awk ’{print $2}’`
当然您可以自己编写更好的shell脚本,欢迎与大家分享。
另外子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。就是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,而此时,尽管对它的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
3、如何避免僵尸进程?
处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结 束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下 可以简单地将 SIGCHLD信号的操作设为SIG_IGN。
signal(SIGCHLD,SIG_IGN);
这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程;或者用两次fork(),而且使紧跟的子进程直接退出,是的孙子进程成为孤儿进程,从而init进程将负责清除这个孤儿进程。
Linux系统文件系统优化及磁盘检查的方法
Linux系统top命令的使用方法介绍
Linux系统中的守护进程讲解
Linux系统中smbclient命令的使用方法
关于Linux查看系统版本的方法汇总
PHP脚本修改Linux或Unix系统口令方法
Linux下查看进程和线程的方法
深入介绍Linux操作系统定时调度系统Cron
Linux 系统故障排查和解决方法
解读Linux系统中的进程调度
Linux中生成Core Dump系统异常信息记录文件处理方法介绍
Linux系统使用附加权限的方法介绍
嵌入式Linux系统中的GUI系统的研究与移植介绍
Linux查看系统版本的方法
解析Linux系统中的进程调度
僵尸的游戏高中作文
linux系统常用的系统信息查看命令
Linux操作系统中BSD套接口开发基础介绍
Linux认证基础知识:linux操作系统目录结构
entOS 6.7 Linux系统的IP配置方法
Linux系统守护进程的启动方法
Linux系统死机解决方法
Linux系统使用NTP服务器的方法
Linux Shell脚本系列教程详细介绍
实用的Linux/Unix系统磁带管理命令
Linux_ext2/ext3文件系统介绍
Win10 Version 1607中如何进行Linux子系统安装
linux系统中scp命令的使用方法
让XP与Linux系统二者相互共存的方法
Ubuntu Linux系统的分区方案示例
linux操作系统的版本介绍
Linux系统下动态库的生成介绍
Linux认证系统管理:linux下搭建ftp
常见的Linux操作系统介绍
Linux系统中sleep的使用方法
linux系统下sudo命令使用方法
微机电系统工程专业介绍
风控相关系统及建设方法介绍
Linux系统入门学习方法
Linux系统下的进程切换的解析