在管道中使用GNU parallel

时间:2013-10-27 06:45:09

标签: bash pipe gnu-parallel

从文件中读取时,运行以下命令可以执行我想要的操作:

parallel --gnu -j2 "echo {} && sleep 5" < myfile.txt

我想用管道做类似的事情。请注意,我使用以下页面获取管道读取器和写入器的灵感:http://www.linuxjournal.com/content/using-named-pipes-fifos-bash

这是我的管道阅读器文件:

#!/bin/bash

pipe=/tmp/testpipe

trap "rm -f $pipe" EXIT

if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    parallel --gnu -j2 "echo {} && sleep 5" <$pipe
done

echo "Reader exiting"

这是我的作家:

#!/bin/bash

pipe=/tmp/testpipe

if [[ ! -p $pipe ]]; then
    echo "Reader not running"
    exit 1
fi


if [[ "$1" ]]; then
    echo "$1" >$pipe
else
    echo "Hello from $$" >$pipe
fi

然后我多次运行pipeWriter,例如

$ ./pipeWriter one
$ ./pipeWriter two
$ ./pipeWriter three
$ ./pipeWriter four
$ ./pipeWriter five
$ ./pipeWriter six
$ ./pipeWriter seven
$ ./pipeWriter eight
$ ./pipeWriter nine
$ ./pipeWriter ten
$ ./pipeWriter ww
$ ./pipeWriter wwdfsdf
$ ./pipeWriter wwdfsdfsddfsd
$ ./pipeWriter testAgain

运行pipeReader的shell显示:

$ ./pipeReader 
one
four
eight
ww
testAgain

首先,存在数据丢失的问题。其次,在管道中并行似乎并不是并行运行。我希望它一次运行两个工作(或者更确切地说,最多两个工作。如果只有一个工作没问题,如果另一个工作可以启动它。)

我哪里错了?

1 个答案:

答案 0 :(得分:2)

我无法解释丢失的数据,当我运行它时,我不会丢失数据。但是,我可以解释为什么你没有看到并行运行的作业:阅读器中的while - 循环只能将一个参数传递给parallel

而不是管道使用http://www.gnu.org/software/parallel/man.html#example__gnu_parallel_as_queue_system_batch_manager

中描述的文件

也许你也可以使用cat

while true
do
    cat $pipe
done | parallel --gnu -j2 "echo {} && sleep 5"

如果您还没有这样做,请完成本教程;你的命令行会爱你:http://www.gnu.org/software/parallel/parallel_tutorial.html