akr*_*kry 9 parallel-processing bash shell
我想做以下事情:
同时执行多个shell脚本(此处为2个脚本).
等到两个脚本完成
转储每个脚本的返回值
但是,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)
#!/bin/bash
sleep 5
echo 2
Run Code Online (Sandbox Code Playgroud)
如果你安装了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
这是我一直在运行的一些代码,它们似乎完全符合您的要求.只需插入./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
在后台运行的脚本,因此我建议您使用退出状态将信息返回给调用进程.
您寻求的答案就在这个问题外壳中 - 获取后台进程的退出代码
基本上,当您将进程置于后台时,您无法直接获取其退出代码。但如果运行 bash wait 命令,那么wait
的退出代码将返回后台进程的退出代码。
./a.sh &
pid1=$!
./b.sh
ret2=$?
wait ${pid1}
ret1=$?
Run Code Online (Sandbox Code Playgroud)
即使 a.sh 在运行 wait 之前结束,这也会起作用。特殊变量$?
保存前一个进程的退出代码。并$!
保存先前运行的进程的进程ID。