【问题标题】:Gnu parallel combine args from stdin and fileGnu 并行组合来自标准输入和文件的参数
【发布时间】:2019-02-28 21:28:46
【问题描述】:

我正在使用 gnu 并行命令来监控几个 redis 端点,然后在新端点上执行所有命令。 当前命令如下所示:

parallel --ungroup redis-cli -h {} monitor :::: old-server-list | cut -d  "]" -f 2 | parallel --ungroup -k ./writter.sh {}

和writer.sh

parallel redis-cli -h {} $1 ::: redis-host-1 redis-host-2 

但是我在旧端点和新端点上执行的命令所需的时间不一致,导致与新 redis 的连接一直在关闭和打开。是否可以同时将参数从标准输入和文件传递给并行命令?将“new-server-list”中的每条记录与相同的标准输入结合起来以避免调用脚本?

类似:

parallel ... | cut ... | parallel redis-cli -h {<line from new-server-list>} {<stdin from pipe>}

应该被执行为:

redis-cli -h redis-host-1 stdin_output1
redis-cli -h redis-host-2 stdin_output1
redis-cli -h redis-host-1 stdin_output2
redis-cli -h redis-host-2 stdin_output2

【问题讨论】:

    标签: bash redis parallel-processing gnu


    【解决方案1】:

    您可以使用paste 并排粘贴两列,一列来自文件,一列来自命令:

    那么,看看这个:

    seq 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

    还有一个名为 list.txt 的文件以另一种方式运行:

    10
    9
    8
    7
    6
    5
    4
    3
    2
    1
    

    现在paste 这样做了:

    paste list.txt <(seq 10)
    10  1
    9   2
    8   3
    7   4
    6   5
    5   6
    4   7
    3   8
    2   9
    1   10
    

    您可以输入 GNU Parallel

    paste list.txt <(seq 10) | parallel -k --colsep '\t' echo {2} {1}
    1 10
    2 9
    3 8
    4 7
    5 6
    6 5
    7 4
    8 3
    9 2
    10 1
    

    【讨论】:

    • 我编辑了我的问题以便更好地理解。我需要在第三个管道中插入 args 并将每个标准输入与文件中的所有记录结合起来。不确定我能不能在 3th 里面做桌子..
    • 我还是不明白,对不起!你想要两个文件的所有排列吗?如果是这样,您可以创建一个名为 list1 的文件,其中包含 4 行,另一个名为 list2.txt 的文件包含 3 行,并为 12 行输出执行 parallel -a list1.txt -a list2.txt echo {1} {2},即所有排列。
    • 例如,我可以成功写入 redis-endpoint.com:parallel --ungroup redis-cli -h {} monitor :::: old-server-list | cut -d "]" -f 2 | parallel --ungroup redis-cli -h redis-endpoint.com {} 现在我需要用多个端点替换 redis-endpoint.com,以便我可以向所有端点写入相同的命令。所以我需要用标准输入和端点(最初在文件中)进行排列,1:n
    【解决方案2】:

    您是否正在考虑从文件“-”中读取?

    parallel --line-buffer redis-cli -h {} monitor :::: old-server-list |
      cut -d  "]" -f 2 |
      parallel --line-buffer -k redis-cli -h {2} {1} :::: - ::: redis-host-1 redis-host-2
    

    使用--dry-run 查看是否是您要运行的命令:

    parallel --line-buffer redis-cli -h {} monitor :::: old-server-list |
      cut -d  "]" -f 2 |
      parallel --dry-run --line-buffer -k redis-cli -h {2} {1} :::: - ::: redis-host-1 redis-host-2
    

    (如果您要实际使用输出,切勿使用-u。存在半行混合的风险 - 从而弄乱您的输出。改用--line-buffer,它可以保证全行)。

    【讨论】:

    • parallel --line-buffer redis-cli -h {} monitor :::: old-server-list | cut -d "]" -f 2 | parallel --line-buffer -k redis-cli -h {args from :::} {line from pipe} ::: redis-host-1 redis-host-2 所以我需要连接来自管道的输出和来自 ::: 的 args(我使用文件首先存储 enpoints,但我可以将它们用作行中的 args)。甚至可以连接这两个吗?使用 args 在线输出管道?
    • 我交换了 {1} 和 {2},我认为这是您想要的。使用--dry-run 确认它是否真的是您要运行的命令。
    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2013-08-31
    相关资源
    最近更新 更多