引言
我们知道shell中的命令都是串行执行的,如果想要充分利用服务器资源,减小等待时间, 让程序并行运行就需要些技巧了, 本文分享一些shell并行运行程序的技巧,下面会用代码演示并行执行3个任务,并等待所有任务都执行完成后再执行后续的逻辑。
代码演示
准备工作
在做整体的演示之前,先写一个程序模拟任务运行的过程,之后演示时会用到该程序。

该程序名叫task.sh,其会休眠几秒模拟任务运行的过程,其有2个参数
- 第一个参数是任务名称
- 第二个参数是要休眠的时长(单位秒),相当于模拟程序运行了多少秒
调用方式如下
1 | 启动一个名为task1的任务, 运行10秒后结束 |
串行执行
shell中的命令都是串行执行的,下面这段代码比较典型,在启动程序的脚本中非常常见,大家应该比较熟悉。
如下依次启动3个任务, task1 运行10秒, task2 运行20秒,task3运行30秒

test1执行结果如下

可以看到任务是串行执行的, task1运行了10秒,task2运行了20秒,task3运行了30秒,总共运行了60秒,这个符合我们的预期。
并行执行
之前讲了shell中的命令都是串行执行的,如果想要充分利用服务器资源,减小等待时间, 让程序并行运行该如何做呢?
这里并不希望大量改造程序,希望用最小的代价,让程序并行运行, 下面提供一种思路 使用&和wait改造启动脚本即可,不需要大量改造程序。
基础知识铺垫
知识点1:**& 让程序后台运行**
在shell脚本中当我们需要把一个任务放在后台运行时,通常我们会使用&符号, 此时主进程会继续往下执行,而子进程会在后台启动运行。
知识点2:wait命令 在shell脚本“多进程”执行模式下,起到一些特殊控制的作用
× wait命令用来阻塞当前进程的执行,直至指定的子进程执行结束后,才继续执行。如果wait后面不带任何的进程号或作业号,那么wait会阻塞当前进程的执行,直至当前进程的所有子进程都执行结束后,才继续执行
× wait命令一个很重要用途就是用在shell并行编程中,可以在shell脚本中启动多个后台进程(使用&),然后调用wait命令,等待所有后台进程都运行完毕后,主进程再继续向下执行。
并行改造1
有了上面的知识铺垫,下面再看一段代码(参见 test2),其和test1的区别是增加了&, 让任务后台运行。

执行结果如下

可以看到3个任务虽然是并行执行的,但总运行时长是0秒, 也即主进程并没有等待3个任务运行完就结束了,相当于失去了对子进程的控制。
并行改造2
下面再看一段代码(参见test3), 其在test2的基础上更进一步,在末尾加了wait命令,其会等待上面3个任务都执行完才会执行后面的命令

test3的运行结果如下,可以看到总运行时长是30秒,从时间上可以看出其是等运行时间最长的任务结束后才执行后面的逻辑,也即等所有任务都运行结束后才会执行后面的逻辑。

这就是我想要的结果,比较贴合实际情况,在子任务运行完成后,主程序还要做一些收尾工作,所以要等所有子任务都执行完才能执行后续的逻辑。
结语
通过上述的改造, 可以大大的提高程序运行效率,在完成业务需求的同时,还可以充分利用主机资源,减少等待时间。
该技巧抽取自笔者真实项目中的实践,在几乎没有改造主体代码的情况下就能让程序并行运行,也不失为一种好办法。笔者就是用这些朴素的技巧,硬是将运行时长从十几小时降到十分钟内,达到了优化目标,小伙伴们快点实践起来吧!
微信端的朋友也可关注我的公众号
