1. HOW
我们在linux系统的终端执行命令的时候,有些命令可以很快的执行完退出,我们就可以继续使用这个终端了
比如 ls
这个命令,它执行的很快,等他返回完结果之后,我们可以继续使用这个终端。
还有部分命令是不会立马执行完的,需要等待一段时间,甚至永远不会执行完(比如top
),这种情况就会阻塞终端,我们就没法继续使用这个终端了,除非你ctrl+c
退出正在执行的脚本。
举个例子,现在有这样一个sehll脚本,
#!/bin/bash
sleep 100
file="sss.txt"
echo 'execute completed' >> $file
在终端输入 ./yy.sh
执行该脚本,终端会被阻塞100秒,如果你想继续执行其他指令,只能新开一个终端
那么,有没有办法让他不阻塞终端呢? 有
将 ./yy.sh
改为 ./yy.sh &
即可,注意&前边有个空格
以这种方式执行脚本,脚本会转入后台默默运行,不再会阻塞终端
通过ps -ef | grep yy.sh
,可以看到脚本确实在后台运行
2. WHY
以后台运行shell脚本有什么好处呢?这个终端被堵塞用不了,我再开一个不就得了,确实是这样,很多时候再开一个就够了,然后有时候却会引发灾难。
非阻塞模式执行脚本更多用在开机自启脚本上(我是这样的)
举个例子,现在我们想设置一个开机自启脚本,这个脚本能够记录系统的资源占用情况,并写到文件里,这是一个很常用的功能脚本。
然后,我们可以/etc/rc.local
文件中加上执行命令,假设命令是这样的
sh -c /home/autoRun.sh
再给rc/.local加上执行权限 sudo chmod +x /etc/rc.local
reboot重启
恭喜你! 重装系统吧 哈哈(别问我怎么知道的,f**k)
因为你的自启脚本是阻塞模式执行的,导致rc.local脚本永远执行不完,然后就进不了系统了
所以,这个时候必须使用非阻塞模式执行脚本,正确的写法是
sh -c /home/autoRun.sh &
这样,就没有问题了。 再次强调,记得加空格!