Paramiko ssh 因输出较大而死机/挂起
- 2025-02-24 09:29:00
- admin 原创
- 61
问题描述:
我尝试使用 Paramiko 和 SSH 备份服务器以调用tar
命令。当文件数量有限时,一切都运行良好,但当文件夹很大时,脚本会无休止地等待。以下测试向我表明问题出在 stdout 的大小上。
有没有办法纠正这个问题并执行这种命令?
案例大输出:
query = 'cd /;ls -lshAR -h'
chan.exec_command(query)
while not chan.recv_exit_status():
if chan.recv_ready():
data = chan.recv(1024)
while data:
print data
data = chan.recv(1024)
if chan.recv_stderr_ready():
error_buff = chan.recv_stderr(1024)
while error_buff:
print error_buff
error_buff = chan.recv_stderr(1024)
exist_status = chan.recv_exit_status()
if 0 == exist_status:
break
结果是(不正常-阻塞-死亡??)
2015-07-25 12:57:07,402 --> Query sent
案例小输出:
query = 'cd /;ls -lshA -h'
chan.exec_command(query)
while not chan.recv_exit_status():
if chan.recv_ready():
data = chan.recv(1024)
while data:
print data
data = chan.recv(1024)
if chan.recv_stderr_ready():
error_buff = chan.recv_stderr(1024)
while error_buff:
print error_buff
error_buff = chan.recv_stderr(1024)
exist_status = chan.recv_exit_status()
if 0 == exist_status:
break
结果是(一切正常)
2015-07-25 12:55:08,205 --> Query sent
total 172K
4.0K drwxr-x--- 2 root psaadm 4.0K Dec 27 2013 archives
0 -rw-r--r-- 1 root root 0 Jul 9 23:49 .autofsck
0 -rw-r--r-- 1 root root 0 Dec 27 2013 .autorelabel
4.0K dr-xr-xr-x 2 root root 4.0K Dec 23 2014 bin
2015-07-25 12:55:08,307 --> Query executed (0.10)
放到 GitHub 上:
https://github.com/paramiko/paramiko/issues/563
解决方案 1:
如果ls -R
打印大量错误输出(如果当前用户不是root
=> 无权访问所有文件夹,则可能出现这种情况),您的代码最终会死锁。
这是因为,错误流的输出缓冲区最终会被填满,因此ls
停止工作,等待您读取流(清空缓冲区)。
当您等待常规输出流完成时,它永远不会做什么,因为它ls
等待您读取错误流,而您永远不会做什么。
您必须并行读取两个流(请参阅使用 Python Paramiko 在不同的 SSH 服务器中并行运行多个命令)。
或者更简单的是,使用Channel.set_combine_stderr
将两个流合并为一个。
解决方案 2:
检查退出状态之前读取数据
channel.recv_exit_status() 挂起
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD