如何杀掉D状态的进程?[zt]【转】
轉(zhuǎn)自:http://blog.csdn.net/chinalinuxzend/article/details/4288791
[-]
原貼:http://www.xclinux.cn/?p=752
如何殺掉D狀態(tài)的進(jìn)程?[zt]
?????? 狀態(tài)為 D (Uninterruptible sleep) ,以及狀態(tài)為 Z (Zombie)這些垃圾進(jìn)程要么是求而不得,像怨婦一般等待資源(D),要么是僵而不死,像冤魂一樣等待超度(Z),它們?cè)?CPU run_queue 里滯留不去,把 Load Average 弄的老高老高,沒看過我前一篇blog的國際友人還以為這兒民怨沸騰又出了什么大事呢。怎么辦?開槍!kill -9!看你們走是不走。但這兩種垃圾進(jìn)程偏偏是刀槍不入的,不管換哪種槍法都?xì)⒉坏羲鼈儭o奈,只好reboot,像剿滅禽流感那樣不分青紅皂白地一律撲殺!?
?????? 基本想法就是修改內(nèi)核,遍歷進(jìn)程列表,找到處于D狀態(tài)的進(jìn)程,將其狀態(tài)轉(zhuǎn)換為別的狀態(tài)就可以kill掉了。?
這是一種比較粗魯?shù)姆椒?#xff0c;可能會(huì)引起一些不良后果,暫時(shí)沒有考慮。對(duì)于確切知道已經(jīng)沒有什么用處,不用做清理工作的,處于D狀態(tài)怎么也殺不死的進(jìn)程來說,確是很有效。?
內(nèi)核模塊代碼:?
—————-killd.c—————-?
#include <linux/init.h>?
#include <linux/module.h>?
#include <linux/sched.h> //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?
插入模塊的時(shí)候提供D狀態(tài)的進(jìn)程號(hào),就可以將其轉(zhuǎn)換為stopped狀態(tài),使用普通kill就可以殺死。?
./insmod ./killd.ko pid=1234
總結(jié)
以上是生活随笔為你收集整理的如何杀掉D状态的进程?[zt]【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PostgreSQL failed IA
- 下一篇: 将 instance 连接到 vlan1