并行运行bash命令,跟踪结果和计数

前端之家收集整理的这篇文章主要介绍了并行运行bash命令,跟踪结果和计数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道如果可能,我可以在BASH中创建一个简单的作业管理来并行处理多个命令。也就是说,我有一大堆命令来运行,我希望有两个可以在任何时间运行。

我非常了解bash,所以这里的要求使它变得棘手:

>命令具有可变的运行时间,所以我不能只生成2,等待,然后继续下两个。一旦完成一个命令,就必须运行下一个命令。
>控制过程需要知道每个命令的退出代码,以便可以共同保留多少个失败

我在想,我可以使用陷阱,但我没有看到一个简单的方法获取处理程序中的孩子的退出值。

那么,关于如何做到这一点的任何想法呢?

那么这里有一些概念代码证明应该可以工作,但是它会破坏bash:无效的命令行生成,挂起,有时是一个核心转储。

# need monitor mode for trap CHLD to work
set -m
# store the PIDs of the children being watched
declare -a child_pids

function child_done
{
    echo "Child $1 result = $2"
}

function check_pid
{
    # check if running
    kill -s 0 $1
    if [ $? == 0 ]; then
        child_pids=("${child_pids[@]}" "$1")
    else
        wait $1
        ret=$?
        child_done $1 $ret
    fi
}

# check by copying pids,clearing list and then checking each,check_pid
# will add back to the list if it is still running
function check_done
{
    to_check=("${child_pids[@]}")
    child_pids=()

    for ((i=0;$i<${#to_check};i++)); do
        check_pid ${to_check[$i]}
    done
}

function run_command
{
    "$@" &
    pid=$!
    # check this pid now (this will add to the child_pids list if still running)
    check_pid $pid
}

# run check on all pids anytime some child exits
trap 'check_done' CHLD

# test
for ((tl=0;tl<10;tl++)); do
    run_command bash -c "echo FAIL; sleep 1; exit 1;"
    run_command bash -c "echo OKAY;"
done

# wait for all children to be done
wait

请注意,这不是我最终想要的,而是要获得我想要的基础。

跟进:我已经在Python中实现了一个系统。所以任何使用Python进行脚本编写的人都可以拥有上述功能。参见shelljob

GNU Parallel是awesomesauce:
$ parallel -j2 < commands.txt
$ echo $?

它将退出状态设置为失败的命令数。如果你有超过253个命令,请查看–joblog。如果您不知道所有的命令,请查看–bg。

猜你在找的Bash相关文章