shell并行(并发或者叫多进程)执行的陷阱

我常用的并行执行有以下几种方式:

  1. 脚本中调用另外的脚本
bash script01.sh &
bash script02.sh &
bash script03.sh &
wait

2.函数并行执行

func_01 &
func_02 &
func_03 &
wait

3.循环体并行执行

for i in {1..50}
do
{
    ping 192.168.1.$i -c 3 &>/dev/null
    if [ $? = 0 ]; then
        echo "[SUCCESS] 192.168.1.$i" is alive.
    else
        echo "[ERROR] 192.168.1.$i is dead!"
    fi
}&
done
wait


注意:如下方式的循环体是无法进行并行执行的

cat svn_exist_files.txt | while read LINE
do
{
    pinyin_name=$(svn log $LINE | grep line | head -n1 | cut -d' ' -f3)
    echo $LINE $pinyin_name >> final_list.txt
    echo 'this is a loop.'
}&
done
wait

echo 'Can this line be printed in the last?'

执行这样的脚本,首先被打印的就是Can this line be printed in the last?这一行,说明这里的wait是没有起到我们想要达到的目的。

可以将cat svn_exist_files.txt | while read LINE改成for i in $(cat svn_exist_files)便可以并行执循环体了,但是要注意svn_exist_files.txt文本中的每一行只有一列,也就是每一行文本不能有空格!

结论:cat xxx | while read LINE 这种循环体是不可以并行执行的!

你可能感兴趣的:(shell并行(并发或者叫多进程)执行的陷阱)