在Bash脚本中同时运行多个脚本

59

我有一个包含其他脚本的bash脚本,它们按顺序运行。然而,运行所有脚本需要相当长的时间。是否有一种方法可以并行运行这些脚本以提高运行效率?它们互不影响。

它看起来类似于:

#!/bin/bash

#some code here
cppcheck.sh
churn.sh
run.sh

更新:

**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!"

这是churn.sh中的代码。粗体命令需要大约40秒才能执行。如果在主脚本中放置churn.sh&之后的&符号,它会抛出一个错误,说sed无法读取churn.txt文件(因为它还没有被创建)。似乎它不会等到输出保存在文件中。我在那个命令之后插入了wait,但它没有帮助。

1个回答

133
使用&将其放在后台运行即可。
cppcheck.sh &
churn.sh &
run.sh &

wait
echo "All 3 complete"

它将为每个进程派生一个新的进程。
正如评论中所述,如果您有一些要在这三个进程完成后在父脚本上运行的内容,则 wait 命令非常方便。
如果没有参数,它将等待所有子进程完成,然后恢复执行父脚本。
你面临的问题似乎直接与此相关。设置的变量仅对定义它们的子shell可见。因此,如果在父脚本中指定了OUT_DIR,则当它分叉时,子脚本将无法看到它。在这种情况下正确的做法是将变量作为环境变量export

19
另外,调用'wait'将确保父脚本在所有后台作业完成之前不会退出。 - user1898811
1
@Bdar,你刚才说这些脚本彼此独立。如果你想在它们的执行之间增加一点时间,可以尝试使用 sleep n && churn.sh &。否则,最好按顺序执行它们。 - Anirudh Ramanathan
@DarkCthulhu 是的,这些脚本是彼此独立的。但在cppcheck内部有一行代码创建了一个输出(大约需要20秒),接下来的一行代码使用该输出进行操作,但似乎它跳过了等待输出被创建的步骤,这是在脚本内部发生的。那么,这是否意味着&符号在脚本内部也是有效的? - Bdar
@Bdar,您能否发布遇到此问题的相关部分?& 这不应该影响单个脚本本身的执行。 - Anirudh Ramanathan
1
@Bdar,我没有遇到这样的问题。我刚刚测试了一下类似的情况,即使有延迟。如果我猜测的话,我会猜测您的${OUTPUT_DIR} 在子脚本中没有被设置。您的父脚本是否执行了 export OUTPUT_DIR=<value>?您能否先使用硬编码的 OUTPUT_DIR 进行检查? - Anirudh Ramanathan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接