fork炸弹
在编写Shell脚本时不要写出不可控的死循环,比如func() { func | func& } ; func
,简写版为.(){ .|.& };.
。接下来见证一下这两条语句的威力。因为在root
用户下许多资源没有限制,所以useradd userfork
新建一个用户userfork
,然后passwd userfork
输入两遍密码设立密码。
使用userfork
重新登录一个Shell终端,称之为B终端
。
然后在B终端
里边执行func() { func | func& } ; func
。
若是出现-bash: fork: retry: No child processes
,按下Ctrl+c,会短暂地出现命令提示符,然后接着会显示-bash: fork: retry: No child processes
,因为输出太快了,所以只能截到出现命令提示符短暂出现的画面,而无法截到命令提示符和下边的-bash: fork: retry: No child processes
同时出现的画面。
直到屏幕上显示-bash: fork: Resource temporarily unavailable
,按下Ctrl+c,才能退出。
.(){ .|.& };.
跟func() { func | func& } ; func
效果一样,被称为fork炸弹
。
nice和renice
nicetest.sh
里边的命令如下:
#!/bin/bash
# test nice
count=1
while test ${count} -le 10
do
echo "$$ loop ${count}"
count=$[ ${count}+1 ]
sleep 30
done
这个脚本会需要循环10次,每次间歇30秒,所以这个脚本共计会执行300秒,每次循环都会输出进程号 loop 次数
。
nice -n 10 ./nicetest.sh >> nicetest.out &
ps -p 24422 -o pid,ppid,nice,cmd
可以看到进程24422
的进程号、父进程号、nice值和命令。
renice -n -10 -p 24422
可以把24422
进程的nice
改为-10
。
此文章为7月Day 30学习笔记,内容来源于极客时间《Linux 实战技能 100 讲》。