并行化、连接和错误检查bash命令



考虑以下shell脚本:

#!/bin/bash
set -e
foo
bar
baz
fini

这将依次串行执行子命令foobarbaz,如果其中任何一个失败(set -e(,则终止,然后执行fini命令。

我如何修改此脚本,以便:

  • 三个子命令foobarbaz并行执行
  • 如果其中任何一个失败(exitcode不成功(,脚本将终止(如set -e(,并终止/等待任何正在运行的子命令
  • 如果并且直到所有三个foobarbaz都已完成(并且已成功完成(,则不运行fini命令

在后台运行的进程上使用作业控制内置程序,如waitkill

概念验证示例:

#!/usr/bin/env bash
echo "Starting jobs."
sleep 1 && echo "job 1" && exit 0 &
sleep 2 && echo "job 2 (Will fail)" && exit 1 &
sleep 3 && echo "job 3" && exit 0 &
echo "Waiting for jobs"
for ((n = 0; n < 3; n++)); do
if ! wait -n; then
echo "A job failed! Goodbye."
while read pid; do
kill $pid 2>/dev/null
done < <(jobs -p)
exit 1
fi
done
echo "One last task"

相关内容

  • 没有找到相关文章

最新更新