您的位置:首页 > 职场人生

fork炸弹+限制单个用户可用虚拟内存和进程数

2009-12-14 11:44 435 查看
fork炸弹+限制单个用户可用虚拟内存和进程数
Linux 2009-12-03 15:44 阅读84 评论0 字号: 大大 中中 小小 实例脚本
脚本名: ulimit.sh
if [ $UID -ge 500 ]
then
ulimit -v 100000
ulimit -m 100000
ulimit -u 200
fi
注: ulimit -m和-v参数的单位为Kbytes. uid为500及500以上的用户都将自动修改ulimit数值(then后面的ulimit指令).

概念注释
·在Linux中,fork()和vfork() 是用于创建进程的两个函数。
·虚拟内存(virtual memory): ulimit -v 限制单个进程可用的虚拟内存大小, 其中虚拟内存包括所有的内存类型, 包括堆栈, 内存映射文件. ulimit -v 100000限制了单个进程最多能够使用100M内存, 超出该限制终端将会收到一个内存不足的错误.
·最大驻留集大小(maximum resident set size): ulimit -m 100000限制单个进程实际能驻留在RAM中的代码和数据大小不能超过100M.
·最大用户进程数(max user processes): ulimit -u 200限制当前用户同时不能超过拥有200个进程数.

实例操作一 进程fork炸弹
运行shell命令行, 运行下面指令:
[zhaoke@islab ~]$ ulimit -a
max memory size (kbytes, -m) unlimited
max user processes (-u) 4096 //这个限制不对root用户生效
virtual memory (kbytes, -v) unlimited

[root@kk ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@kk ~]# :(){ :|:& };:
[1] 4831

[root@kk ~]# top
- 00:10:00 up 6 min, 2 users, load average: 260.58, 931.39, 318.91 //哈哈,相当猛烈啊!!
Tasks: 7229 total, 7155 running, 73 sleeping, 0 stopped, 1 zombie
过几秒钟后系统停止任何服务.
(需强行reset系统)

补充说明:
定义一个循环调用自己的函数执行,你把函数名":"改成别的也一样
a() { a|a& }; a
a() { :|:& }; a

实例操作二 用ulimit.sh限制进程fork炸弹
1. 在/etc/profile.d目录下创建ulimit.sh脚本, 内容如上.
2. 打开shell终端, 然后再运行实例操作一中的第二步
[kk@kk root]$ ulimit -u 100
[kk@kk root]$ :(){ :|:& };:
[1] 4883
[kk@kk root]$ bash: fork: 资源暂时不可用
bash: fork: 资源暂时不可用
bash: fork: 资源暂时不可用
使用Ctrl-C终止fork炸弹进程.

task:Configuring the Linux Kernel Parameters 相关配置文件/etc/sysctl.conf
1, vi /etc/sysctl.conf 文件
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 4294967296 物理内存的一半(4096*1024*1024)
# semaphores: semmsl, semmns, semopm, semmnikernel.sem = 250 32000 100 128
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
#for oracle10G
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144

2, 运行命令使设置生效
# /sbin/sysctl –p

3,查看生效的配置
# sysctl -a

补充:
“:” 命令在激活变量替换时,非常有用!
例如: :${LINES:=24} ${TERM:? “TERM not set”}
说明: “:”是一个空操作,但是shell仍然计算它的参数。这样,若LINES 为空或未定义,它就被设为24 。 若TERM为空或未定义,那么整个脚本失败并发出出错消息”TERM not set”

参考文档: http://zhaoke.com/blog/128.html
关于fork的详细介绍: http://www.lupaworld.com/384165/viewspace-139532
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 虚拟内存