rsync -vvv 在 OS X 中卡住,没有明确的解释

rsync -vvv 在 OS X 中卡住,没有明确的解释

突然(不确定问题何时开始)我rsync针对给定机器的命令被卡住了:

$ (dd bs=1024 count=1024 </dev/urandom >/tmp/temp_file && rsync -arvvv --progress /tmp/temp_file -e ssh hostname.sldc.company.net:/tmp/)
1024+0 records in
1024+0 records out
1048576 bytes transferred in 0.087832 secs (11938431 bytes/sec)
opening connection using: ssh hostname.sldc.company.net rsync --server -vvvlogDtpre.iLsfx . /tmp/  (7 args)

我有同样的问题没有 -e ssh返回相同的精确的错误(包括ssh我没想到的位)

$ (dd bs=1024 count=1024 </dev/urandom >/tmp/temp_file && rsync -arvvv --progress /tmp/temp_file analytics04.sldc.dataxu.net:/tmp/)
1024+0 records in
1024+0 records out
1048576 bytes transferred in 0.086265 secs (12155310 bytes/sec)
opening connection using: ssh hostname.sldc.company.net rsync --server -vvvlogDtpre.iLsfx . /tmp/  (7 args)

笔记: 我公司没有其他人有这个问题,但我有不是任何其他机器也有这个问题或者使用本机和不同的用户名。我也可以ssh毫无问题地进入机器。

我可以做什么来诊断问题?

平台及版本:

这一切都在 OS X Yosemite 上:

$ uname -a
Darwin my_machine.net 14.3.0 Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64 x86_64

和:

$ rsync --version
rsync  version 3.1.1  protocol version 31
Copyright (C) 1996-2014 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes, no prealloc, file-flags

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

我用它安装的brew。我也遇到了rsync与 OS X 附带的版本相同的问题:

$ rsync --version
rsync  version 2.6.9  protocol version 29
Copyright (C) 1996-2006 by Andrew Tridgell, Wayne Davison, and others.
<http://rsync.samba.org/>
Capabilities: 64-bit files, socketpairs, hard links, symlinks, batchfiles,
              inplace, IPv6, 64-bit system inums, 64-bit internal inums

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

DTrace 命令:

这个要点显示了我通过运行以下命令得到的第一部分:

sudo dtruss rsync -arvvv temp_file [email protected]:/tmp/

然后在上面要点的最后一行之后,立即询问我的密码:

[email protected]'s password:
select(0x6, 0x7FFF50052860, 0x0, 0x7FFF500527E0, 0x7FFF500528F8)                 = 0 0
select(0x6, 0x7FFF50052860, 0x0, 0x7FFF500527E0, 0x7FFF500528F8)                 = 0 0
select(0x6, 0x7FFF50052860, 0x0, 0x7FFF500527E0, 0x7FFF500528F8)                 = 0 0
select(0x6, 0x7FFF50052860, 0x0, 0x7FFF500527E0, 0x7FFF500528F8)                 = 0 0

(每隔约 60 秒左右,就会打印与上面最后一行相同的新行)

答案1

如果您认为问题可能是空闲连接被关闭,您也许可以通过使用一个--timeout选项来解决该问题(较新的 rsync 在间歇期间发送保持活动消息)。您还可以将 ssh 配置为在使用协议 2 时发送保持活动消息(查找 KeepAlive、ServerAliveInterval、ClientAliveInterval、ServerAliveCountMax 和 ClientAliveCountMax)。您还可以通过从 --delete (又名 --delete-before)切换到 --del (又名 --delete-during)来避免一些间歇。

如果您无法弄清楚失败发生的原因,可以采取一些步骤来调试情况。一种方法是在远程系统上创建 shell 脚本,如下所示:

#!/bin/sh

ulimit -c unlimited

# Some systems have "truss" or "tusc" instead of "strace".
# The -f option tells strace to follow children too.
# The -t option asks for timestamps.
# The -s 1024 option increases the string decoding limit per function call.
# The -o option tells strace where to send its output.
strace -f -t -s 1024 -o /tmp/rsync-$$.out rsync "${@}"

您将使用这样的脚本:

rsync -av --rsync-path=/some/path/rsync-debug HOST:SOURCE DEST
rsync -av --rsync-path=/some/path/rsync-debug SOURCE HOST:DEST

此脚本启用核心转储,并将导致失败的所有操作系统系统调用记录到 /tmp 目录中的文件中。您可以使用生成的文件来帮助找出远程 rsync 失败的原因。

相关内容