我正在使用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
答案 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
,它可以保证整行)。