0

我有一个文件 a.txt ,每一行都包含一个参数。现在我想使用 mpiexec 来调用我的程序,例如 a.out 来计算每个参数。所以我使用 linux shell 脚本来处理这个问题。代码是示例

    cat a.txt | while read line
    do
        mpiexec -v -hostfile hosts -np 16 ./a.out ${line} 
    done 

没想到脚本只处理了一行文件a.txt就结束了。那么,是因为管道使用不当造成的吗?我该如何解决这个问题?

4

2 回答 2

0
#!/bin/bash
for LINE in `cat a.txt | xargs -r`; do
    mpiexec -v -hostfile hosts -np 16 ./a.out $LINE 
done 
于 2013-11-12T08:04:55.083 回答
0

我也有这个问题。Claudio 的解决方案帮助我走上了正确的道路,让我理解了循环在第一次迭代后退出的原因。首先,这是一个非常接近您所写的解决方案:

cat a.txt | while read line; do
    </dev/null mpiexec -np 16 ./a.out ${line}
done

请注意,我只是mpiexec在本地计算机上使用,(python 的线程情况非常糟糕,需要这个)所以我无法测试这是否适用于单独的主机。您可以尝试将其添加回自己。

您的脚本不起作用的原因是它mpiexec似乎吞噬了附加到标准输入的任何内容。我假设它这样做是为了在a.out需要该输入的情况下,它会吞噬所有输入并将其与要运行的命令一起a.out发送到其他服务器。结果是在第一次迭代中,read从文件中读取第一行。然后mpiexec读取其余的行,即使a.out在您的情况下可能不使用它们。然后在第二次迭代中,read尝试读取更多行,但由于mpiexec已经读取了其余行,read因此被告知已到达文件末尾,因此循环退出。

由于我们想阻止mpiexec读取标准,我们将mpiexec的标准重定向到来自 /dev/null。由于 /dev/null 始终不包含任何内容,mpiexec因此不会读取任何内容并单独保留标准输入。

于 2021-06-25T14:51:58.593 回答