gpt4 book ai didi

bash - 如果任何功能并行失败,请停止 bash

转载 作者:行者123 更新时间:2023-12-04 18:27:43 25 4
gpt4 key购买 nike

我有一个 BASH,可以在我的 BASH 中并行运行 3 个函数。

        functionA () {
......
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
}

functionB () {
......
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
}

functionC () {
......
my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}
}

functionA &
functionB &
functionC &
wait

我在所有函数中都有一些这样的错误处理命令:

my command || { echo "ERROR!!" >> $LOG_FILE ; exit 1 ;}

我注意到,即使我在所有函数中都有用于错误处理的导出 1,但其他函数仍在继续。如果任何函数失败,如何停止 bash 并返回退出代码 1?

我是 BASH 的新手,非常感谢任何帮助!

最佳答案

更新:用大量子进程同时终止测试我的原始代码表明需要某种独占锁定机制;我使用广泛可用的 mktemp -d 和符号链接(symbolic link)实现了一个简单的(即原子的)。

#!/bin/bash

lockdir=$(mktemp -d) || exit "$?"

trap 'exit 1' ABRT
trap 'mv "$lockdir" "$lockdir~" && rm -rf "$lockdir~"; kill 0' EXIT

diex() { ln -s _ "$lockdir/.lock" 2> /dev/null && kill -ABRT "$$"; }

{ sleep 1; echo "ERROR!!"; diex; } &
{ sleep 2; echo "HELLO!!"; } &

wait

注意:这里我假设 "$lockdir~" 不存在。如果它对您来说不够好,那么您可以使用 mktemp -d 创建另一个目录,并在删除它之前将其用作垃圾箱。

说明:

想法是让子进程在失败时用kill -ABRT "$$" 通知主脚本。
我选择了 SIGABRT 信号,因为它适用于中止的目的,但它具有禁用通常在接收到 SIGABRT 时自动生成核心转储的效果。如果您运行的操作系统支持 SIGUSR1SIGUSR2,那么您可以改用它。

  1. 在脚本的开头,您使用 trap 定义了一些信号监听器,并关联了一个在捕获指定类型的信号时要运行的命令:
  • EXIT 信号的监听器(例如由主脚本上下文中的 exit 命令触发)将终止脚本及其所有子进程使用 kill 0

  • SIGABRT 的监听器(由子进程发送)不仅会生成 EXIT 信号,还会将退出状态设置为 1

  1. 锁定机制是为了防止发送多个SIGABRT信号。

关于bash - 如果任何功能并行失败,请停止 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71776455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com