而环路并行悬挂

时间:2018-02-02 17:56:57

标签: bash shell gnu-parallel

试图解决为什么这不起作用以及我将如何解决它。使用并行的while循环的简单示例。

set -eu

TOKEN='hello'

query() {
    while [ -z "$TOKEN" ];
    do
        echo "This is $1 and this is $2"
    done
}

export -f query

parallel query ::: 4 4 4 4 ::: 0 1 2 3

每当我从CLI运行它时,它就会无限期挂起,我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

[ -z "$TOKEN" ]将永远为真,因为您没有导出变量。因此循环会永远持续下去,导致挂起。

由于parallel是一个外部命令,因此必须导出您希望它及其子级访问的所有变量。

如果导出它,脚本将成功终止(但显然没有输出,因为永远不会输入while循环)。

注意:环境变量是每个进程。其他人不会看到一个过程中的更新,因此您不能将它们用作信号量或IPC。如果您正在尝试这样做,那么您将不得不使用其他内容(例如文件或管道)。

答案 1 :(得分:1)

@that other guy's answer is correct, but maybe I can tempt you to try env_parallel, which automatically exports your environment.

答案 2 :(得分:0)

-z $TOKEN永远不会成真,因为你已经初始化了它。