繁体   English   中英

并行运行多个命令,并在其中一个失败或全部成功时返回

[英]Run multiple commands in parallel, and return whenever one of them fails or all of them succeed

我看到了以下问题: Bash run two commands and get output from both这几乎满足了我的需要。

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

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

如果可以使用标准命令(如 xargs 或 parallel)就更好了,但如果它是使用 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

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

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

最近版本的GNU Parallel专注于这个问题。 杀死正在运行的孩子,如果一个孩子失败:

parallel --halt now,fail=1 'echo {};{}' ::: true false true true false

杀死正在运行的孩子,如果一个人成功:

parallel --halt now,success=1 'echo {};{}' ::: true false true true false

杀死正在跑步的孩子,如果20%失败:

parallel -j1 --halt now,fail=20% 'echo {#} {};{}' ::: true true true false true true false true false true

在每个信号之间等待50毫秒时,给孩子发出TERM,TERM,TERM,KILL信号:

parallel --termseq TERM,50,TERM,50,TERM,50,KILL -u --halt now,fail=1 'trap "echo TERM" SIGTERM; sleep 1;echo {};{}' ::: true false true true false

解决了类似的情况,如果对某人有帮助,请在这里分享。

我有三个命令要运行。

  • server1server2是长时间运行的命令,例如网络服务器。
  • healthcheck命令运行一些检查以确保服务器正常。 它需要两台服务器来执行测试。

要求的行为:

  • 如果healthcheck成功(返回代码为 0),则阻塞直到服务器运行。 这是正常操作。
  • 如果healthcheck失败,立即返回。 如果服务器有问题,这是需要的。

以下为我完成了工作:

server1 & server2 & healthcheck && wait

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM