GNU parallel与rsync

7
我正在尝试使用GNU parallel通过ssh并行运行一些rsync实例。我运行的命令如下:
find /tmp/tempfolder -type f -name 'chunck.*' | sort | parallel --gnu -j 4 -v ssh -i access.pem user@server echo {}\; rsync -Havessh -auz -0 --files-from={} ./ user@server:/destination/path

/tmp/tempfolder 包含以前缀 chunck 命名的文件,它们包含实际的文件列表。

使用此命令,我成功获取了 4 次 rsync 的调用,但是它们需要一段时间才能开始运行,并且不会同时开始运行也不会并行运行。

我做错了什么?

1个回答

2

您确定rsync没有并行运行吗?在命令运行时使用ps | grep rsync可以查看实际上有哪些rsync同时运行。

默认情况下,parallel会保持每个作业的输出,直到它完成,以便不同命令的输出不会混杂在一起:

--group  Group output. Output from each jobs is grouped together and is only printed when the command
         is finished. stderr (standard error) first followed by stdout (standard output). This takes
         some CPU time. In rare situations GNU parallel takes up lots of CPU time and if it is
         acceptable that the outputs from different commands are mixed together, then disabling
         grouping with -u can speedup GNU parallel by a factor of 10.

         --group is the default. Can be reversed with -u.

我猜测rsync实际上是并行运行的,但从输出结果看起来像是串行运行。使用-u选项可以改变这种情况。

--

例如,使用以下命令:

$ for i in 1 2 3 ; do echo a$i ; sleep 1 ; done
a1
a2
a3

默认情况下,当我们并行执行时,在所有操作完成前我们无法得到任何反馈:

$ (echo a ; echo b ; echo c ) | parallel 'for i in 1 2 3 ; do echo {}$i ; sleep 1 ; done  ' 
a1
a2
a3
b1
b2
b3
c1
c2
c3

如果使用-u,则内容会立即打印出来:

$ (echo a ; echo b ; echo c ) | parallel -u 'for i in 1 2 3 ; do echo {}$i ; sleep 1 ; done  ' 
a1
b1
c1
a2
b2
c2
a3
b3
c3

在这两种情况下,运行时间都是3秒,因此它们实际上是同时运行的...


2
如果考虑使用-u选项,请同时查看--line-buffer。 - Ole Tange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接