shell并行(并发或者叫多进程)执行的陷阱
2017-11-10 本文已影响0人
正哥哥
我常用的并行执行有以下几种方式:
- 脚本中调用另外的脚本
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 这种循环体是不可以并行执行的!