Linux Shell 并行及串行执行命令

近期系统准备上线,上线前有一批需要在Linux上执行的耗时较长的命令,为了效率有的命令需要并行执行,同时因为有数据库的外键关系等原因,有的命令需要等其他命令执行完毕才能执行。这就引出了并行和穿行执行命令的话题。下面是总结的方法。

命令尾部加上“&”即可把命令作为后台进程执行。即,有一批命令需要定时执行,则把这批命令放在一个sh文件中,每个命令后面加上符号”&”,这样执行时就会并行执行,如main.sh:

command1 args &
command2 args &
command3 args &

如果有些命令需要在这批命令执行成功之后执行,则需要修改上面的文件,在末尾填上一行
wait
对了,关键就是这个wait,它会这批命令中每个都执行成功后再返回(如果没有的话,它会在开启这些命令后就退出了,无法控制跟其他命令的串行关系);

其他命令怎么办呢?再写一个sh文件others.sh(假设others中的命令需要按顺序执行,就不能在末尾加&了):

other_cmd1 args
other_cmd2 args

最后再写个总控的sh文件all.sh:

main.sh
others.sh
因为后面没有&符号,所以会在main.sh中的所有命令执行成功后再执行others.sh。

为了试验效果,我写了个测试文件test.sh,输出日志文件以便判断调度顺序是否正常:

#!/bin/bash
d=`date ‘+%Y-%m-%d %H:%M:%S’`
echo $d start $1 >> /log/test.log
sleep $2
d=`date ‘+%Y-%m-%d %H:%M:%S’`
echo $d finish $1 >> /log/test.log

调用这个文件需要两个参数:1. 模拟的job命令名称,随意命名,只要自己能识别是哪个命令; 2. 一个数字,表示这个命令需要执行多少秒才能结束,举例如下:

./test.sh work_order 4 &
./test.sh work_order_detail 4 &
wait

灵活运用以上内容,可以设计出相对比较复杂的调度流程。