【问题标题】:Run a bash command in parallel with xargs与 xargs 并行运行 bash 命令
【发布时间】:2011-12-11 08:46:57
【问题描述】:

我希望有人可以帮助我解决这个简单的问题。我想并行运行这个命令

windmill chrome test=./test http://www.google.ch

我在玩 xargs 并查看了互联网上的示例。但是,我无法构造一个 xargs 命令来并行执行我提到的命令。

我尝试了以下

echo "chrome test=./test http://www.google.ch" | xargs -n 1 -P 2 windmill

没有执行正确的命令意味着风车一定执行了错误的命令,因为输出不正确(风车的默认输出用于指定错误的参数)。

尽管如此,我遇到了另一个问题,即终端/python 抱怨“socket.error: [Errno 48] Address already in use”。

因此,当我通过打开例如两个终端并在每个终端中运行风车命令来并行运行风车命令时,它就可以工作了。

如果 xargs 不是解决方案,那么如果您能指出正确的方法,我将不胜感激 :)

【问题讨论】:

    标签: bash xargs windmill


    【解决方案1】:

    xargs 不会并行运行您的命令。

    你为什么不在任何与 bourne 兼容的 shell 中执行这个?

    for i in 1 2; do windmill chrome test=./test http://www.google.ch & done
    

    【讨论】:

    • 这很好用。但是,我收到套接字绑定错误。似乎这些命令必须以某种方式在不同的终端中运行才能拥有单独的套接字?
    • 不,套接字与终端没有任何共同之处。似乎您的程序无法运行多个实例,因为它试图绑定同一个套接字。也许有一个命令行参数来更改绑定地址/端口?
    • 嗯,但是为什么可以同时在不同的终端运行命令呢?如果我可以手动设置套接字,我已经查看了风车的规格(实际上没有合适的文档>:[)
    • 我发现有时程序绑定到最近发布的套接字时会出现问题,有时则不会。
    【解决方案2】:

    您提到要并行运行命令。只有当程序本身在内部并行化时才能做到这一点。

    但是,您可以做的是并行运行多个命令。假设您想并行运行这些:

    windmill chrome test=./test http://www.google.ch
    windmill chrome test=./test http://www.google.se
    windmill chrome test=./test http://www.google.no
    windmill chrome test=./test http://www.google.de
    

    使用 GNU Parallel 你可以做到:

    parallel windmill chrome test=./test http://www.google.{} ::: ch se no de
    

    观看介绍视频以了解更多信息:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 并浏览教程(man parallel_tutorial)。你爱你的命令行。

    如果这不是您想要的,请重新表述您的问题。

    【讨论】:

      【解决方案3】:

      我发现有时程序在绑定到最近发布的套接字时会出现问题——内核出于安全原因试图阻止这种情况。如果您需要能够立即重新绑定,您可能应该尝试 SO_REUSEADDR 或每次都绑定到不同的端口。

      【讨论】:

        猜你喜欢
        • 2019-12-07
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        相关资源
        最近更新 更多