匹配以Bash并行运行的函数的输出

问题描述 投票:3回答:1

我的Bash脚本看起来像这样:

#!/bin/bash
function a { echo -n "A is running..."; sleep 5; echo "done (A)" }
function b { echo -n "B is running..."; sleep 1; echo "done (B)" }
function c { echo -n "C is running..."; sleep 3; echo "done (C)" }

a
b
c

因为这三个操作不是宇宙中最快的,所以我正在考虑通过并行运行来加快运行速度,例如:

a & b & c & wait

但是,将输出弄乱了,像这样:

[1] 21405
A is running...[2] 21406
B is running...[3] 21408
C is running...done (B)
[2]  - 21406 done       b
done (A)
[1]  - 21405 done       a
done (C)
[3]  + 21408 done       c

理想情况下,我希望输出与原始作业的输出相似,并且处理顺序固定,以便用户可以看到当前正在运行的内容:

A is running...done (A)
B is running...done (B)
C is running...done (C)

这意味着当B完成时,我想要这样的东西:

A is running...
B is running...done (B)
C is running...

有可能吗?在不重写太多功能(最好是)的情况下,实现此目标的好方法是什么?

并且在相关说明中,是否可以添加断路器,即如果B发生故障,而A和C自动终止?

bash gnu-parallel
1个回答
0
投票
#!/bin/bash                                                                     
function a { sleep 8; }                                                        
function b { sleep 10; }                                                         
function c { sleep 5; }                                                         

a &                                                                             
b &                                                                             
c &                                                                             

echo 'a is running.'                                                            
echo 'b is running.'                                                            
echo 'c is running.'                                                            

W=3                                                                             
while [ $W -gt 0 ]; do                                                          
        wait -n                                                                 
        ((W--))                                                                 

        A=`jobs -l | cut -b2`                                                   

        echo -n -e "\e[3A"                                                      
        if [[ $A =~ 1 ]]; then                                                  
                echo 'a is running.'                                            
        else                                                                    
                echo 'a is running... (done).'                                  
        fi                                                                      
        if [[ $A =~ 2 ]]; then                                                  
                echo 'b is running.'                                            
        else                                                                    
                echo 'b is running... (done).'                                  
        fi                                                                      
        if [[ $A =~ 3 ]]; then                                                  
                echo 'c is running.'                                            
        else                                                                    
                echo 'c is running... (done).'                                  
        fi                                                                      
done                                                                            

请注意,命令echo -n -e "\e[3A"将光标向上移动3行。

© www.soinside.com 2019 - 2024. All rights reserved.