加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 并行运行多个命令,并在其中一个命令失败或所有命令都成

发布时间:2020-12-15 22:38:55 所属栏目:安全 来源:网络整理
导读:我见过以下问题: Bash run two commands and get output from both几乎可以满足我的需求. 但是,wait命令是阻塞的,这意味着如果命令2在命令1成功之前失败,则命令2失败但命令1成功时命令不会返回. 是否可以并行运行多个命令,并且只要其中一个命令失败就返回1,
我见过以下问题: Bash run two commands and get output from both几乎可以满足我的需求.

但是,wait命令是阻塞的,这意味着如果命令2在命令1成功之前失败,则命令2失败但命令1成功时命令不会返回.

是否可以并行运行多个命令,并且只要其中一个命令失败就返回1,如果所有命令都成功则返回0(并尽快返回)?

如果使用标准命令(如xargs或并行)可能会更好,但如果使用bash编写也可以.

解决方法

此代码提供正确的退出代码,并杀死幸存者进程:

#/bin/bash

# trap for SIGTERM and set RET_VALUE to false
trap "RET_VAL=false" SIGTERM

MY_PID=$$
# Initialize RET_VALUE to true
RET_VAL=true

# This function will executed be in a separate job (see below)
thread_listener() {
    # Starts the long time job 
    ./longJob.sh &
    PID=$!
    # trap for sigterm and kill the long time process
    trap "kill $PID" SIGTERM
    echo waiting for $PID
    echo Parent $MY_PID
    # Send a SIGTERM to parent job in case of failure
    wait $PID || kill $MY_PID
    exit
}

echo $MY_PID

# Runs thread listener in a separate job
thread_listener &
PID1=$!

# Runs thread listener in a separate job
thread_listener &
PID2=$!

wait
# send sigterm to PID1 and PID2 if present
kill $PID1 2> /dev/null
kill $PID2 2> /dev/null
# returns RET_VALUE
$RET_VAL

有关代码的说明,请参阅注释.
诀窍是如果需要,启动能够接受或发送信号给父工作的工作.

子作业在其长时间工作失败的情况下向父母发送信号,并且父母在等待之后向其子女发送信号(父母接收到等待立即返回的信号)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读