为什么Fabric显示与服务器断开连接的信息近2分钟?
Fabric 在我每次输入 fab 命令时,都会显示 Disconnecting from username@server... done.
,这个过程几乎要持续两分钟,之后才会出现新的命令提示符。
这个问题在我对内部服务器和 Rackspace 云服务器使用 Fabric 命令时都存在。下面我附上了服务器的 auth.log 日志,而在我的 MacBook 上没有看到任何相关的日志。
大家有什么想法,觉得问题出在哪里吗?
服务器的 SSH auth.log,日志级别设置为 VERBOSE
Apr 21 13:30:52 qsandbox01 sshd[19503]: Accepted password for mrankin from 10.10.100.106 port 52854 ssh2
Apr 21 13:30:52 qsandbox01 sshd[19503]: pam_unix(sshd:session): session opened for user mrankin by (uid=0)
Apr 21 13:30:52 qsandbox01 sudo: mrankin : TTY=unknown ; PWD=/home/mrankin ; USER=root ; COMMAND=/bin/bash -l -c apache2ctl graceful
Apr 21 13:30:53 qsandbox01 sshd[19503]: pam_unix(sshd:session): session closed for user mrankin
服务器配置
- 操作系统:Ubuntu 9.10 和 Ubuntu 6.10(测试了4台使用这些操作系统的服务器)
- OpenSSH:Ubuntu 软件包版本 1.5.1p1-6ubuntu2
客户端配置
- 操作系统:Mac OS X 10.6.3
- Fabric 版本 0.9
- Virtualenv 版本 1.4.7
- pip 版本 0.7
用于测试的简单 fabfile.py
即使我只是运行 fab -H server_ip host_type
,使用以下的 fabfile,问题依然存在。
from fabric.api import run
def host_type():
run('uname -s')
对问题原因的思考
我不确定这个问题持续了多久,但以下是我开始注意到使用 Fabric 时服务器断开连接变慢后的一些变化。
我使用 virtualenv 1.4.7、virtualenvwrapper 2.1 和 pip 0.7 重新创建了我的虚拟环境。不确定这是否相关,但我在虚拟环境中运行 fabfiles,所以这是个考虑因素。我启用了 OS X 的防火墙。我禁用了 OS X 的防火墙,但问题依然存在,所以这不是问题的原因。
2 个回答
感谢大家在这里关注这个问题。我想提醒一下读者,之前Paramiko 1.7.4版本和Fabric 0.9版本是比较稳定的,但最近一两周,有好几个用户开始遇到类似的断开连接超时的问题。所以我猜可能是其他某个组件(比如Python升级,或者远程服务器的软件包升级,或者其他什么原因)导致了1.7.4版本出现了bug。
我会查看Paramiko 1.7.5和1.7.6的更新日志,并收集更多关于用户平台、Python版本等的信息,看看是否能找出一些规律。
编辑:关于这个问题的新创建的Redmine工单在这里: http://code.fabfile.org/issues/show/158
解决方案
在我的虚拟环境中,我输入了以下命令后,问题就解决了:
pip install -U paramiko
这个命令安装了paramiko-1.7.6和pycrypto-2.0.1。之前我用的是paramiko-1.7.4和pycrypto-2.0.1。
看起来是paramiko出了问题,因为pycrypto的版本没有变化。至少可以确定paramiko 1.7.4和Fabric 0.9之间有一些不兼容的地方,而通过把paramiko升级到1.7.6就解决了这个问题。
注意:我在一个虚拟环境中把paramiko升级到1.7.6,确认问题消失了。然后我激活了另一个仍然使用paramiko-1.7.4的虚拟环境,发现问题依然存在。接着我把paramiko从1.7.4升级到1.7.6,结果在那个虚拟环境中问题也解决了。