Archive for 十一月, 2009

fork炸弹和解决对策

星期五, 十一月 20th, 2009

fork炸弹,是指一种程序,不停无限制的fork子进程,从而耗尽系统资源让机器死机的一种程序,下面是两个fork炸弹:
1.shell型
.(){ .|.& };.
这行看起来很妙的语句其实主要意思是申明了一个函数,名字叫. 函数的内容就是 fork一个新进程,而新进程也正是自己,这样就一得二,二得四,不停的以二为底数不停增加,瞬间占满资源。

2.c型
cat > a.c
//输入下面的两行代码
#include
int main() { while (1) fork(); }

gcc a.c
./a.out

这个原理更简单,直接就是不停的fork 。

以上两个都是比较危险的程序,除非是测试机,否则不要运行。

在redhat里面有反制措施,在/etc/security/limits.conf里加上下面几行

* hard core 0
* hard rss 50000
* hard nproc 50

最后一行的意思是,普通用户只允许开启50个进程
另外 echo “session required /lib/security/pam_limits.so” >> /etc/pam.d/login
不过之前要保证/lib/security/pam_limits.so这个文件存在

记得做过这些改动之后要重启 ,重启之后,用普通用户,执行上面两个破坏程序,就会发现很短时间过后,程序就会提示fork失败,无法再开启新进程。

这是永久性解决方法,另外可以通过ulimit 来对进程数做临时限定。