## 递归函数
递归函数既自己调用自己,以下这个案例就是通过递归函数实现或者叫递归炸弹,他可以不断的启动进程消耗系统资源直到系统死机为止。
```
:() { :|:& };:
或
.() { .|.& };.
```
如果不明白它上面意思,我们可以展开来看。
```
:()
{
:|: &
}
;
:
```
其实这里就是一个递归函数函数名为“:”它不断的自己调用自己启动进程,以下详细解释过程。
* 第一行行说明下面要定义一个函数,函数名为冒号":",没有可选参数。
* 第二行表示函数体开始。
* 第三行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。
* 第四行表示函数体结束。
* 第五行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。
* 第六行表示调用本函数。
那么如何防止这种炸弹函数对系统的威胁呢? 我们可以通过ulimit系统命令限制用户的启动最大进程数来保护我们的系统,防止炸弹函数启动N多进程而耗尽系统资源。
```
[root@blog.puppeter.com_centos ~]# ulimit -u 709
[root@blog.puppeter.com_centos ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 4864
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
```
关于炸弹函数更多请参考https://en.wikipedia.org/wiki/Fork_bomb。
- Introduction
- 1.Shell编程基础
- 什么是Shell
- 编写第一个Bash程序
- 2.变量
- 什么是变量
- 变量四种赋值方式
- 指定变量类型
- 变量的类型
- 特殊变量
- 3.Bash符号相关
- Bash符号相关
- 特殊符号
- 数学运算符号
- 4.内建命令与外部命令
- 内建命令与外部命令
- 5.read命令
- read命令
- 6.条件语句
- if..then..fi
- if..then..else..fi
- if..then..elif..fi
- 空命令
- 文件测试符
- 字符串判断、与、或和非
- []与[[]]符号
- 7.Bash循环 && 分支语句
- while循环语句
- for循环
- for..in循环
- until循环
- select循环
- case分支语句
- 8.正则表达式
- 正则表达式
- 9.子Shell和受限Shell
- 子Shell
- 受限Shell
- 10.函数与函数的加载
- 函数语法与案例
- 递归函数
- 函数的加载
- 11.Bash脚本风格
- Bash脚本风格
- 12.Bash脚本调试
- Bash脚本调试
- 13.sed && awk
- sed
- 14.awk
- awk
- 15 Bash杂项 && 案例
- while循环的陷阱
- Bash的生命周期
- IO重定向
- /bin/bash和/bin/sh区别
- 命令杂项
- Shell加密
- 16.10.2.案例
- Bash版回收站
- 17.Bash中文速查表
- 中文速查表