同时执行多个shell脚本

akr*_*kry 9 parallel-processing bash shell

我想做以下事情:

  • 同时执行多个shell脚本(此处为2个脚本).

  • 等到两个脚本完成

  • 转储每个脚本的返回值

但是,main.sh不能按预期工作.


main.sh

#!/bin/bash

ret1=`./a.sh` &
ret2=`./b.sh`

if [ "${ret1}"="" -a "${ret2}"="" ]; then
   sleep 1
else
   echo ${ret1},${ret2}
end
Run Code Online (Sandbox Code Playgroud)

#!/bin/bash
sleep 10
echo 1
Run Code Online (Sandbox Code Playgroud)

b.sh

#!/bin/bash
sleep 5
echo 2
Run Code Online (Sandbox Code Playgroud)

Ole*_*nge 7

如果你安装了GNU Parallel http://www.gnu.org/software/parallel/,你可以这样做:

parallel -j0 '{}; echo $?' ::: a.sh b.sh
Run Code Online (Sandbox Code Playgroud)

我怀疑您是否希望退出代码检查其中一个是否失败,并且您实际上并不关心精确的退出代码是什么.在这种情况下,你可以这样做:

parallel -j0 ::: a.sh b.sh || echo one or both of them failed
Run Code Online (Sandbox Code Playgroud)

如果足以获得失败的最后一个错误代码:

parallel -j0 --halt 1 ::: a.sh b.sh; echo $?
Run Code Online (Sandbox Code Playgroud)

如果b.sh提前完成但是失败了,也许你想杀死a.sh:

parallel -j0 --halt 2 ::: a.sh b.sh; echo $?
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式安装GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
Run Code Online (Sandbox Code Playgroud)

观看GNU Parallel的介绍视频以了解更多信息:https: //www.youtube.com/playlist?list = PL284C9FF2488BC6D1


Lee*_*ton 5

这是我一直在运行的一些代码,它们似乎完全符合您的要求.只需插入./a.sh./b.sh在适当的地方:

# Start the processes in parallel...
./script1.sh 1>/dev/null 2>&1 &
pid1=$!
./script2.sh 1>/dev/null 2>&1 &
pid2=$!
./script3.sh 1>/dev/null 2>&1 &
pid3=$!
./script4.sh 1>/dev/null 2>&1 &
pid4=$!

# Wait for processes to finish...
echo -ne "Commands sent... "
wait $pid1
err1=$?
wait $pid2
err2=$?
wait $pid3
err3=$?
wait $pid4
err4=$?

# Do something useful with the return codes...
if [ $err1 -eq 0 -a $err2 -eq 0 -a $err3 -eq 0 -a $err4 -eq 0 ]
then
    echo "pass"
else
    echo "fail"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,这会捕获脚本的退出状态,而不是它输出的内容stdout.没有简单的方法来捕获stdout在后台运行的脚本,因此我建议您使用退出状态将信息返回给调用进程.


Mic*_*lon 4

您寻求的答案就在这个问题外壳中 - 获取后台进程的退出代码

基本上,当您将进程置于后台时,您无法直接获取其退出代码。但如果运行 bash wait 命令,那么wait的退出代码将返回后台进程的退出代码。

./a.sh &
pid1=$!
./b.sh
ret2=$?
wait ${pid1}
ret1=$?
Run Code Online (Sandbox Code Playgroud)

即使 a.sh 在运行 wait 之前结束,这也会起作用。特殊变量$?保存前一个进程的退出代码。并$!保存先前运行的进程的进程ID。