Fabric执行find命令输出挂起问题排查求助
遇到这种Fabric执行命令卡住的情况,我碰到过几个常见的原因,给你分析下:
可能的原因及解决办法
1. 远程主机上的find命令本身卡住了
首先你可以先直接在远程主机(10.90.242.76)上手动执行find /tmp -type f,看看命令会不会正常结束:
- 如果手动执行也卡住,那问题出在远程主机上:
- 检查
/tmp目录是否挂载了远程文件系统(比如NFS),如果是,可能是网络问题导致find遍历的时候挂起; - 排查
/tmp下的异常文件:比如某些处于I/O阻塞状态的文件,或者磁盘本身有坏道,导致find读取文件元信息时卡住; - 可以试试缩小范围,比如
find /tmp -maxdepth 1 -type f,看看只查/tmp一级目录会不会卡住,逐步定位问题点。
- 检查
2. Fabric的伪终端(PTY)输出缓冲问题
Fabric默认会为run命令分配伪终端,有时候这种模式下会出现输出缓冲异常,导致Fabric一直等待命令输出结束:
你可以修改代码,给run加上pty=False参数试试:
from fabric.api import run, task @task def test(): run("find /tmp -type f", pty=False)
这个参数会让Fabric直接通过SSH执行命令,不使用伪终端,很多时候能解决输出卡住的问题。
3. SSH会话连接异常
如果远程主机的SSH配置没有开启TCP保活,或者网络存在不稳定的情况,可能导致SSH会话在命令执行后期挂起:
- 可以在本地的SSH配置(
~/.ssh/config)里添加针对该主机的保活设置:
这样会定期发送保活包,避免连接被意外断开。Host 10.90.242.76 TCPKeepAlive yes ServerAliveInterval 30 ServerAliveCountMax 3
4. 命令未明确退出
有时候find命令可能因为某些原因没有正常返回退出码,Fabric一直在等待命令的结束信号:
可以尝试给命令加上超时限制,比如用timeout命令强制终止:
run("timeout 15 find /tmp -type f")
这样即使find卡住,15秒后也会被强制终止,Fabric就能正常结束任务。
内容的提问来源于stack exchange,提问作者Tej
相关产品推荐
相关产品推荐

