如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?

文章目录

问题

如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码?

简单的脚本:

bash 复制代码
#!/bin/bash
for i in `seq 0 9`; do
  calculations $i &
done
wait

上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0(参见 wait 的帮助信息)。我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1


回答

根据 Luca Tettamanti 和 Gabriel Staples 的回答,编写一个完整的可以运行的演示代码:

bash 复制代码
#!/usr/bin/env bash

# 这是一个特殊的 sleep 函数,它将睡眠的秒数作为"错误代码"
# 或"返回代码"返回,以便我们可以清楚地看到,实际上
# 我们在每个进程完成时确实获取了它的返回代码。
my_sleep() {
    seconds_to_sleep="$1"
    sleep "$seconds_to_sleep"
    return "$seconds_to_sleep"
}

# 创建一个你想作为子进程运行的命令数组
procs=()  # bash数组
procs+=("my_sleep 2")
procs+=("my_sleep 1")
procs+=("my_sleep 4")
procs+=("my_sleep 3")

num_procs=${#procs[@]}  # 数组中元素的个数
echo "num_procs = $num_procs"

# 作为子进程运行命令并把 pid 存储到数组中
pids=()  # bash数组
for (( i=0; i<"$num_procs"; i++ )); do
    echo "cmd${i} : ${procs[$i]}"
    ${procs[$i]} &  # 将 cmd 作为子进程运行
    pids+=("$!")    # 存储上一个子进程启动的 pid
    echo "    pid = ${pids[$i]}"
done

for pid in $pids; do
  wait $pid
  rc=$?
  [ $rc -ne 0 ] && break  # 若子进程以非零退出码结束,则跳出循环
done

#echo $rc
exit $rc

将代码保存为文件 wait_procs_demo.sh,再运行测试:


参考


相关阅读:

相关推荐
A小辣椒3 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒7 小时前
TShark:基础知识
linux
AlfredZhao9 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式