并行bash脚本运行多个脚本

Bda*_*dar 48 parallel-processing bash

我有一个bash脚本,其中包含串行运行的其他脚本.但是,运行它们需要相当长的时间.有没有办法并行运行这些脚本以提高整体性能?它们彼此独立.

它看起来类似于:

#!/bin/bash

#some code here
cppcheck.sh
churn.sh
run.sh
Run Code Online (Sandbox Code Playgroud)

更新:

**git log --pretty=format: --numstat | perl -ane'$c{$F[2]} += abs($F[0]+$F[1]) 
if $F[2];END {print "$_\t$c{$_}\n" for sort keys %c}' > ${OUTPUT_DIR}/churn.txt**
sed -i -e '/deps/d;/build/d;/translations/d;/tests/d' -e 30q ${OUTPUT_DIR}/churn.txt
sort -r -n -t$'\t' -k2 ${OUTPUT_DIR}/churn.txt -o ${OUTPUT_DIR}/churn.txt
echo "set term canvas size 1200, 800; set output '${OUTPUT_DIR}/output.html'; 
unset key; set bmargin at screen 0.4; set xtics rotate by -90 scale 0,0; 
set ylabel 'Number of lines changed (total)'; set title 'Files with high churn 
level';set boxwidth 0.7; set style fill solid; set noborder; 
plot '${OUTPUT_DIR}/churn.txt' using 2:xticlabels(1) with boxes" | gnuplot
echo "finished running churn.sh!"
Run Code Online (Sandbox Code Playgroud)

这是churn.sh中的代码.粗体命令需要40秒左右才能实现.如果在主脚本中我在churn.sh&之后放了&符号,则会抛出一个错误,说sed无法读取churn.txt文件(因为它尚未创建).它似乎不会等到输出保存在文件中.我在该命令之后插入等待,但它没有帮助.

Ani*_*han 102

使用&在后台运行它可以解决问题

cppcheck.sh &
churn.sh &
run.sh &

wait
echo "All 3 complete"
Run Code Online (Sandbox Code Playgroud)

它将为每个进程分配一个新进程.

wait如果这三个完成你有什么东西可以在父脚本上运行,那么bash 也会像评论中所说的那样派上用场.

如果没有参数,它将等待所有子进程完成,然后继续执行父脚本.


您面临的问题似乎与此直接相关.变量集仅对定义它们子shell可见.因此,如果您OUT_DIR在父脚本中指定了它,那么当子脚本关闭时它将不可见.在这种情况下,正确的做法是export将变量作为环境变量.

  • 此外,对"等待"的调用将确保父脚本在所有后台作业完成之前不会退出 (17认同)