<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Leftleg's Blog]]></title> 
<link>http://leftleg.hzpub.com/index.php</link> 
<description><![CDATA[Leftleg 生活 记录 摄影 工作 吉他 山地车 blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Leftleg's Blog]]></copyright>
<item>
<link>http://leftleg.hzpub.com/post/696/</link>
<title><![CDATA[[转]大话: 如何消灭状态为D或Z的进程?]]></title> 
<author>leftleg &lt;leftleg@hotmail.com&gt;</author>
<category><![CDATA[linux]]></category>
<pubDate>Tue, 01 Apr 2008 05:44:15 +0000</pubDate> 
<guid>http://leftleg.hzpub.com/post/696/</guid> 
<description>
<![CDATA[ 
	长期生活在 Linux 环境里，渐渐地就有一种环保意识油然而生。比如，我们会在登录提示里写上“悟空，我跟你说过叫你不要乱扔东西，乱扔东西是不对的。哎呀我话没说完你怎么把棍子扔掉了？月光宝盒是宝物，乱扔它会污染环境，要是砸到小朋友怎么办？就算砸不到小朋友，砸到了花花草草也不好嘛...”；在用户缺省目录里放一个题为 “自觉保护环境&nbsp;&nbsp;请勿堆放垃圾”的空文件，并用 chattr +i 设为不可修改；看到垃圾文件就立即扫入 /tmp 目录，然后发广播通知垃圾制造者自己去 /tmp 认领，且警告其下不为例...我们深知，系统环境的整洁有利于系统管理员保持良好的心情、清晰的思路和稳定的工作状态。<br/><br/>有一类垃圾却并非这么容易打扫，那就是我们常见的状态为 D (Uninterruptible sleep) ，以及状态为 Z (Zombie) 的垃圾进程。这些垃圾进程要么是求而不得，像怨妇一般等待资源(D)，要么是僵而不死，像冤魂一样等待超度(Z)，它们在 CPU run_queue 里滞留不去，把 Load Average 弄的老高老高，没看过我前一篇blog的国际友人还以为这儿民怨沸腾又出了什么大事呢。怎么办？开枪！kill -9！看你们走是不走。但这两种垃圾进程偏偏是刀枪不入的，不管换哪种枪法都杀不掉它们。无奈，只好reboot，像剿灭禽流感那样不分青红皂白地一律扑杀！<br/><br/>悟空，我们所运维的可是24*7全天候对外部客户服务的系统，怎么能动不动就 reboot ？我们的考核指标可是4个9(99.99%，全年计划外当机时间不得超过52分钟34秒)，又不是4个8，你稍微遇到点事就reboot，还要不要可用性了？再说，现在社会都开始奔和谐去了，我们对于 D 和 Z 这两种垃圾进程，也该尽可能采取慈悲手段，能解决其困难的，就创造条件，解决其实际困难，能消除其冤结的，就诵经烧纸，消除其前世冤结，具体问题应具体分析具体解决，滥杀无辜只会导致冤冤相报因果循环...$^#$%#%^@#<br/><br/>贫僧还是回来说正题。怨妇 D，往往是由于 I/O 资源得不到满足，而引发等待，在内核源码 fs/proc/array.c 里，其文字定义为“ "D (disk sleep)",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;2 */ ”（由此可知 D 原是Disk的打头字母），对应着 include/linux/sched.h 里的“ #define TASK_UNINTERRUPTIBLE&nbsp;&nbsp;&nbsp;&nbsp;2 ”。举个例子，当 NFS 服务端关闭之时，若未事先 umount 相关目录，在 NFS 客户端执行 df 就会挂住整个登录会话，按 Ctrl+C 、Ctrl+Z 都无济于事。断开连接再登录，执行 ps axf&nbsp;&nbsp;则看到刚才的 df 进程状态位已变成了 D ，kill -9 无法杀灭。正确的处理方式，是马上恢复 NFS 服务端，再度提供服务，刚才挂起的 df 进程发现了其苦苦等待的资源，便完成任务，自动消亡。若 NFS 服务端无法恢复服务，在 reboot 之前也应将 /etc/mtab 里的相关 NFS mount 项删除，以免 reboot 过程例行调用 netfs stop 时再次发生等待资源，导致系统重启过程挂起。<br/><br/>冤魂 Z 之所以杀不死，是因为它已经死了，否则怎么叫 Zombie（僵尸）呢？冤魂不散，自然是生前有结未解之故。在UNIX/Linux中，每个进程都有一个父进程，进程号叫PID（Process ID），相应地，父进程号就叫PPID（Parent PID）。当进程死亡时，它会自动关闭已打开的文件，舍弃已占用的内存、交换空间等等系统资源，然后向其父进程返回一个退出状态值，报告死讯。如果程序有 bug，就会在这最后一步出问题。儿子说我死了，老子却没听见，没有及时收棺入殓，儿子便成了僵尸。在UNIX/Linux中消灭僵尸的手段比较残忍，执行 ps axjf 找出僵尸进程的父进程号（PPID，第一列），先杀其父，然后再由进程天子 init（其PID为1，PPID为0）来一起收拾父子僵尸，超度亡魂，往生极乐。注意，子进程变成僵尸只是碍眼而已，并不碍事，如果僵尸的父进程当前有要务在身，则千万不可贸然杀之。<br/><br/>这篇写出鬼气来了，就此打住。阿米豆腐，善哉善哉！<br/>Tags - <a href="http://leftleg.hzpub.com/tags/nfs/" rel="tag">nfs</a> , <a href="http://leftleg.hzpub.com/tags/mount/" rel="tag">mount</a> , <a href="http://leftleg.hzpub.com/tags/umount/" rel="tag">umount</a> , <a href="http://leftleg.hzpub.com/tags/service/" rel="tag">service</a> , <a href="http://leftleg.hzpub.com/tags/busy/" rel="tag">busy</a> , <a href="http://leftleg.hzpub.com/tags/zombie/" rel="tag">zombie</a> , <a href="http://leftleg.hzpub.com/tags/%25E5%2583%25B5%25E5%25B0%25B8/" rel="tag">僵尸</a> , <a href="http://leftleg.hzpub.com/tags/%25E8%25BF%259B%25E7%25A8%258B/" rel="tag">进程</a> , <a href="http://leftleg.hzpub.com/tags/%25E7%2588%25B6%25E8%25BF%259B%25E7%25A8%258B/" rel="tag">父进程</a> , <a href="http://leftleg.hzpub.com/tags/%25E5%25AD%2590%25E8%25BF%259B%25E7%25A8%258B/" rel="tag">子进程</a>
]]>
</description>
</item><item>
<link>http://leftleg.hzpub.com/post/696/#blogcomment1324368</link>
<title><![CDATA[[评论] [转]大话: 如何消灭状态为D或Z的进程?]]></title> 
<author>K &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Tue, 08 Apr 2008 00:15:05 +0000</pubDate> 
<guid>http://leftleg.hzpub.com/post/696/#blogcomment1324368</guid> 
<description>
<![CDATA[ 
	太好玩了，这篇文章，写得很形象。
]]>
</description>
</item><item>
<link>http://leftleg.hzpub.com/post/696/#blogcomment1324509</link>
<title><![CDATA[[评论] [转]大话: 如何消灭状态为D或Z的进程?]]></title> 
<author>seatle &lt;seatle@163.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 28 Aug 2008 06:34:09 +0000</pubDate> 
<guid>http://leftleg.hzpub.com/post/696/#blogcomment1324509</guid> 
<description>
<![CDATA[ 
	清除D状态的进程还有一个办法：gdb attach &lt;pid&gt;，在gdb里执行kill命令。<br/>这是被NFS整得痛苦了N次之后找到的办法，呵呵。
]]>
</description>
</item>
</channel>
</rss>