Linux服务器上top后发现僵尸进程的解决办法
在Linux服务器日常巡查中,使用top命令后发现了僵尸进程,如
zombie这个参数就代表僵尸进程的含义,什么是僵尸进程呢?(这里盗用一下官方的解释)
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。
在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集。除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD 信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了, 那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
解决过程:
1、查找僵尸进程的相关信息:ps -e -o stat,ppid,pid,cmd|egrep '^[Zz]'
ps:ps命令用于获取当前系统的进程信息.
-e:参数用于列出所有的进程
-o:参数用于设定输出格式,这里只输出进程的stat(状态信息)、ppid(父进程pid)、pid(当前进程的pid),cmd(即进程的可执行文件。
egrep:是linux下的正则表达式工具
'^[Zz]':这是正则表达式,^表示第一个字符的位置,[Zz],表示z或者大写的Z字母,即表示第一个字符为Z或者z开头的进程数据,只所以这样是因 为僵尸进程的状态信息以Z或者z字母开头。
查询出来为
其中红色Z表示僵尸进程,第一串数字192038 为父进程,第二串数字235458为子进程。
2、使用 kill -HUP 235458来杀掉这个僵尸进程,运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死
如果kill 子进程的无效,可以kill 其父进程来解决问题,例如上面例子父进程pid是 192038 ,那么我们就运行kill -HUP 192038 来解决问题。
3、再次top后确认已处理完僵尸进程
- 点赞
- 收藏
- 关注作者
评论(0)