![](/img/trans.png)
[英]Run Multiple bash commands and return false if one of them fails in bash
[英]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
解决了类似的情况,如果对某人有帮助,请在这里分享。
我有三个命令要运行。
server1
和server2
是长时间运行的命令,例如网络服务器。healthcheck
命令运行一些检查以确保服务器正常。 它需要两台服务器来执行测试。要求的行为:
healthcheck
成功(返回代码为 0),则阻塞直到服务器运行。 这是正常操作。healthcheck
失败,立即返回。 如果服务器有问题,这是需要的。以下为我完成了工作:
server1 & server2 & healthcheck && wait
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.