永发信息网

如何处理D状态进程

答案:2  悬赏:10  手机版
解决时间 2021-01-31 16:19
  • 提问者网友:溺爱和你
  • 2021-01-31 03:59
如何处理D状态进程
最佳答案
  • 五星知识达人网友:摆渡翁
  • 2021-01-31 04:27
怎么办?开枪!kill -9!看你们走是不走。但这两种垃圾进程偏偏是刀枪不入的,不管换哪种枪法都杀不掉它们。无奈,只好reboot,像剿灭禽流感那样不分青红皂白地一律扑杀!
基本想法就是修改内核,遍历进程列表,找到处于D状态的进程,将其状态转换为别的状态就可以kill掉了。
内核模块代码:
—————-killd.c—————-
#include
#include
#include //for_each_process
MODULE_LICENSE("BSD");
static int pid = -1;
module_param(pid, int, S_IRUGO);
static int killd_init(void){struct task_struct * p;
printk(KERN_ALERT "killd: force D status process to death/n");
printk(KERN_ALERT "killd: pid=%d/n", pid);
//read_lock(&tasklist_lock);
for_each_process(p){
if(p->pid == pid){
printk("killd: found/n");
set_task_state(p, TASK_STOPPED);
printk(KERN_ALERT "killd: aha, dead already/n");return 0;}}printk("not found");
//read_unlock(&tasklist_lock);return 0;}static void killd_exit(void){printk(KERN_ALERT "killd: bye/n");}module_init(killd_init);
module_exit(killd_exit);
—–Makefile————
obj-m := killd.o
编译模块make -C yourkerneltree M=`pwd` modules
插入模
全部回答
  • 1楼网友:上分大魔王
  • 2021-01-31 04:59
杀不掉的僵尸(zombie)进程linux的进程,有以下几种状态(摘自本文):statedescriptionduninterruptible sleep (usually io)rrunning or runnable (on run queue)sinterruptible sleep (waiting for an event to complete)tstopped, either by a job control signal or because it is being traced.wpaging (not valid since the 2.6.xx kernel)xdead (should never be seen)zdefunct (zombie) process, terminated but not reaped by its parent.当一个进程处于z状态,我们称之为zombie进程,如下所示:#top -b -p 56249 pid user pr ni virt res shr s %cpu %mem time+ command 56249 ats 20 0 0 0 0 z 0.0 0.0 5914:36 [et_net 0] 正常情况下,处于zombie状态的进程,会很快地被它的父进程回收,以致于我们根本不会注意到zombie进程的存在。可在实践过程中,却有一些无法使用kill -9命令杀掉的zombie进程,这常常令我们束手无策。如果某个进程一直处于zombie状态,可能会带来一些严重的问题,例如,假设这个进程没有正确地close掉socket,就会导致这些socket处于close_wait状态,这些socket将会占用系统的ip/port资源,将导致其他程序无法创建特定socket。当出现「杀不掉」的zombie进程,我们常常归咎于kernel的bug,不了了之,但其实还有一种情况常常被忽略。让我们看看上面的这个zombie进程内部,是否还有其他线程(使用top命令的-h参数):#top -b -h -p 56249pid user pr ni virt res shr s %cpu %mem time+ command 56249 ats 20 0 0 0 0 z 0.0 0.0 253:54.05 [et_net 0] 56337 ats 20 0 0 0 0 d 0.0 0.0 38:53.67 [et_aio 0] 56338 ats 20 0 0 0 0 d 0.0 0.0 38:48.24 [et_aio 1] 由上可见,虽然[et_net 0](pid=56249)进程处于zombie状态,但它其实是一个多线程的程序,该程序中的其他线程,如[et_aio 0](pid=56337)等,处于d(uninterruptible sleep)状态,因为d状态的进程(在linux中,线程只是特殊的进程)无法被中断,因此kill -9无法杀掉d状态的进程。也正因为这些d状态的进程的存在,导致父进程无法顺利的回收它们。通常,我们还需要分析处于d状态的进程卡在了哪里。可通过/proc文件系统查看d状态进程的调用栈:#cat /proc/56337/stack[] __blockdev_direct_io_newtrunc+0x6fe/0xb90[] __blockdev_direct_io+0x5e/0xd0[] blkdev_direct_io+0x57/0x60[
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯