如何在 bash 中等待许多后台作业

如何在 bash 中等待许多后台作业

如何在 bash 中进行并行处理?

我的方法,在我的 bash 脚本中,添加了很多后台作业&,然后我使用数组添加每个进程 id,然后我使用循环获取该数组,并在其中使用 wait 命令,但不知何故wait命令不是在职的。

我的代码是这样的

for i in some path 
do 
    ls -d $i | xargs du -kh --max-depth=0 |sed 's/\t/,/g' >> $TEMP/Outfile/disk_usage_Session_wise.csv & 
    pid=$!
    ls -d $i/session | xargs du -kh --max-depth=1 | sed 's/\t/,/g' >> $TEMP/Outfile/disk_usage_Session_wise.csv & 
    pid_1=$! 
    process_list=($pid $pid_1) 
done 

for job in echo ${process_list[@]} 
    do 
    echo "$job is running" 
    wait $job # this command is not working 
done –

答案1

您可以使用其他软件还是仅使用 bash?看起来GNU Parallel这就是您完成任务所需的。或者至少-n-P论据xargs

答案2

这个改进的行应该修复脚本的第一部分:

process_list+=($pid $pid_1) 

这应该是第二部分。请注意,它尚未经过测试。

for job in ${process_list[@]} 
do 
    ps -ho pid | >/dev/null grep $job && {
        echo "$job is running" 
        wait $job # this command should be ok now         
    }
done
  • ps -ho pid-o pid生成不带标题行 ( ) 的正在运行的进程 ( ) 列表-h

  • |它将这个列表转发到 ( )grep

  • grep查找,$job如果找到 ( ),则运行&&命令块 ( ){echo ...}

相关内容