【问题标题】:GNU parallel with rsyncGNU 与 rsync 并行
【发布时间】:2014-05-05 13:27:38
【问题描述】:

我正在尝试使用sshGNU parallel 并行运行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 的调用,但它们需要一段时间才能开始运行,并且不会一起启动,也不会并行运行。

我做错了什么?

【问题讨论】:

    标签: shell parallel-processing rsync gnu-parallel


    【解决方案1】:

    确定 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.
    

    我的猜测是 rsyncs 实际上是并行运行的,但从输出中感觉它们是串行运行的。 -u 选项改变了这一点。

    --

    例如使用这个 cmd:

    $ 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 秒才能运行,所以它实际上是同时运行的......

    【讨论】:

    • 如果考虑 -u,也请查看 --line-buffer。
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多