本文转载自微信公众号《Linux开发那些事儿》,作者LinuxThings。转载此文请联系Linux开发那些事公众号.串行就是按顺序一条一条执行命令。串行的反义词是同时执行多条命令,称为并行使用。在bash脚本中,并发执行命令有很多用途,比如:批量上传下载、批量启动和关闭程序、批量打包日志、批量检查远程机器是否可达等。并行执行可以充分利用系统资源,大大提高效率,节省大量时间。举个例子:现在需要下载20个文件,假设每个文件的下载时间需要1分钟串口下载是一个文件下载完再下载另一个文件,这样20个文件就需要20分钟才能下载完。并行下载就是启动20个进程,同时下载20个进程,每个进程负责下载一个文件。理论上,20个文件全部串并并行下载完只需要1分钟左右。命令后加上&符号表示该命令将在子进程中执行。以下是比较串行和并行c.sh脚本的两个示例#!/bin/bashfunc_a(){echo"func_a..$1.."sleep1}fornin$(seq15);dofunc_a$ndoneecho"c.sh..finish.."执行时间./c.sh,结果如下[root@ecs-centos-7mult]#time./c.shfunc_a..1..func_a..2..func_a..3..func_a..4..func_a..5..c。sh..finish..real0m5.008suser0m0.005ssys0m0.003s上例中连续调用了5次func_a函数,每次调用都会休眠1秒。上一次调用结束后才能进行下一次调用,所以5次调用修改c.sh脚本共耗时5秒,内容如下#!/bin/bashfunc_a(){echo"func_a..$1.."sleep1}fornin$(seq15);dofunc_a$n&donewaitecho"c.sh..finish.."再次执行一次./c.sh,结果如下[root@ecs-centos-7mult]#时间./c.shfunc_a..1..func_a..3..func_a..2..func_a..4..func_a..5..c.sh..finish..real0m1.006suser0m0.004ssys0m0.005s修改后的脚本,在循环体内的func_a$n语句后增加了一个&符号,表示循环结束后会在子进程中执行func_a$n命令。循环结束后有一个wait语句,意思是会等待上一个循环体中的所有子进程结束。执行以下命令由于子进程不会阻塞当前进程,当前进程可以继续执行下一次调用,所以5次调用只需要1秒左右。在执行./c.sh命令的时候,打开另外一个终端输入psaux|grepc.sh回车,输出如下[root@ecs-centos-7~]#psaux|grepc.shroot290860.00.01131881400pts/1S+22:550:00/bin/bash./c.shroot290880.00.0113188628pts/1S+22:550:00/bin/bash./c.shroot290890.00.0113188628pts/1S+22:550:00/bin/bash./c.shroot290900.00.0113188628pts/1S+22:550:00/binarypts/2S+22:550:00grep--color=autoc.sh从上面的输出可以看出,同时有6个c.sh脚本进程,其中5个是5个循环生成的子进程,和1是left是执行c.sh脚本本身检查主机是否可达的过程。当需要管理的远程主机较多时,往往会对这些主机进行一些检查,批量检查主机是否可达是一个常见的操作。下面简单介绍一下如何使用并发执行快速检测主机是否可达如果有一个host.txt文件,里面存放的是主机的IP地址,具体内容如下[root@ecs-centos-7mult]#cathost.txt192.168.0.1192.168.0.2192.168.0.3192.168.0.4192.168.0.5192.168.0.6192.168.0.7192.168.0.8192.168.0.9c.sh脚本,内容如下#!/bin/bashping_test(){ping$1-c2-W3&>/dev/nullif[$?-eq0];thenecho"$1reachable..."elseecho"$1unreachable..."fi}fornin$(cathost.txt);doping_test$n&donewaitecho"c.sh..finish.."执行时间./c.sh,结果如下[root@ecs-centos-7mult]#time./c.sh192.168.0.1reachable...192.168.0.9可访问...192.168.0.4无法访问...192.168.0.3无法访问...192.168.0.6无法访问...192.168.0.2无法访问...192.168.0.8无法访问...192.168.0.7无法访问...192.168.0.5unreachable...c.sh..finish..real0m3.010suser0m0.014ssys0m0.011s脚本中的ping$1-c2-w3语句是ping远程主机的命令,-c2表示发送数据包的次数,-W3是设置超时时间为3秒。从测试结果可以看出,主机192.168.0.1和192.168.0.9可达,其他主机不可达。总共用时约3秒。
