Gnu并行合并来自stdin和文件的args

时间:2018-09-25 09:41:28

标签: bash redis parallel-processing gnu

我正在使用gnu parallel命令监视少量Redis端点,然后在新端点上执行所有命令。 当前命令如下:

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

和writter.sh

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

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

类似:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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,它可以保证整行)。