> 文章列表 > Linux以非堵塞模式执行shell脚本

Linux以非堵塞模式执行shell脚本

Linux以非堵塞模式执行shell脚本

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 &

这样,就没有问题了。 再次强调,记得加空格!