实现shell并发

经常在工作中遇到执行的脚本需要并发执行,提高效率。

  • 常规脚本
1
2
3
4
5
6
7
#!bin/sh
for((i=1;i<=5;i++));do
{
sleep 3;
echo $i
}
done

执行:time bash test.sh
执行结果:总共耗时15秒

1
2
3
4
5
6
7
8
9
10
11
[root@pc disk1]# time sh test.sh
1
2
3
4
5

real 0m15.010s
user 0m0.003s
sys 0m0.005s
[root@pc disk1]#
  • 并发脚本
1
2
3
4
5
6
7
8
9
#!bin/sh
for((i=1;i<=5;i++));do
{
sleep 3;
echo $i
}&
done
wait
echo 'over'

每次for循环后加了一个后台执行&符号,那5个循环任务会并发执行,执行:time bash concurrent.sh
执行结果:总耗时3秒

1
2
3
4
5
6
7
8
9
10
11
12
[root@pc disk1]# time sh concurrent.sh 
1
2
3
5
4
over

real 0m3.004s
user 0m0.001s
sys 0m0.002s
[root@pc disk1]#

wait的作用:等待前面后台执行的任务全部结束再往下执行,否则程序会直接执行结束。当然后台执行的脚本还会继续执行,只不过会影响wait后续的代码。