代码:
:() { :|:& }; :
为何这个东西会让你的系统死掉???有人执行了而后问我
让咱们来分析一下这段代码,我改一下格式,但内容是同样的 代码:
:() # 定义一个叫“:”的过程
{ # 标记过程内容的开始
: | : & # 执行“:”这个过程,而后经过管道接到“:”再执行一次,并且每一次执行,都会在后台执行
}; # 标记过程内容的结束,由于是同一行来写,因此要加上“;”,这样才能接后面的内容
: # 执行:
两个缘由使它死掉:
1. 无限递归。假若只是简单的: &,那么每次递归调用的时候一边在后台执行,而另一边则在退出。然而,即便如此,假若你只是下面的内容,你仍然能够看到很多bash,并且是不断地增多。其缘由极可能是一边产生新的进程的同时,另一边的进程却还没彻底退出。然而,这种产生方式,终究会在某个时刻达到动态平衡,也就是新产生新进程的速度和结束进程的速度达到平衡。于是,这并不必定会让系统挂掉。 代码:
show_ps() { ps -A | grep bash; show_ps & }; show_ps
2. 平衡的破坏
2.1 两个进程同时开始
使用管道的时候,不是一个进程完了而后另一个进程才开始,而是两个进程同时开始,其中一个进程读取另一个进程的标准输出做为标准输入。 代码:
tee | grep abc
能够看到,这个时候,咱们只有输入知足正则表达式abc的内容,它才会被重复。而这个过程会一直持续到咱们结束tee的输入。
2.2 死机的缘由:同时执行致使平衡的破坏。(注意:这只是一个简化的模型。同时执行只是理想状况,真正在执行的时候,会因为实际状况有所误差,但因为误差并不大,因此这个模型仍然可用;另外,如今假设每一个“:”都会产生一个进程,然而实际状况是这样的:先: | : &产生一个进程,接着因为两次:的调用进而产生两个进程,再接着: | : &所在的进程消亡,如此循环,显然,实际状况只是比这个模型增长了一些自我抵销的中间环节而已)
在: | : &执行的时候,咱们知道,两个“:”是同时执行的。假若同时有n个“:”在运行,那么,它将首先产生2*n个进程,而后这n个进程再结束掉,此时至关于新增长了2*n个进程。那从第一次调用开始,假设进程产生后立刻结束,那么进程数量的变化将呈2^n的趋势变化。然而产生新进程的速度是极快的,于是在极短的时间内将会产生无数的进程。在这种状况下,死机是很正常的。
正则表达式