标签:__ Python pipe 死锁 client ssh 服务器 日志
# 读取服务器日志,并打印
if __name__ == '__main__':
# with SSHTunnelForwarder(
# ('120.25.*.*', 22), #跳板机IP,端口
# ssh_username="root", #跳板机用户名
# ssh_password="i8khGtwa7sQra5hXXXXX", #跳板机密码
# # ssh_pkey="./rsa", #ssh 连接使用密钥证书登录,该参数必须;该路径为目标服务器的公钥证书
# # ssh_private_key_password="i8khGtwa7sXXXX", #如果公钥证书有密码,该参数必须,如果没有密码,该参数注释掉
# remote_bind_address=('10.20.XXX', 22), #远程服务器地址、端口
# local_bind_address=('127.0.0.1', 10022) #本机固定127
# ) as tunnel: #以上跳板机代码注销后,下面是直接访问服务器代码
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('10.206.28.139', 22, username='haitian', password='Sf123456!@#', timeout=30)
# do some operations with client session
remote_command = "tail -fn 50 /app/deploy/nwms-base/logs/error.log "
stdin, stdout, stderr = client.exec_command(remote_command)
last_line = stdout.read() # 此处程序会死锁
a = last_line.decode('utf - 8')
print(a)
client.close()
死锁:(引用 https://blog.csdn.net/weixin_39629617/article/details/110773119)
如果设置了stdout或stderr,subprocess就会调用os.pipe创建一个管道用于其和子进程之间的通信,而上面的问题正好是cmd输出的数据把pipe塞满,无法继续往pipe里写入数据导致程序hang住,而我们没有去读出pipe数据,而是死等子进程完成,导致死锁。
具体大小的话windows只有4kb,而linux有64kb(辣鸡windows)
那么如何解决呢
解决办法一:
使用communicate及时读出pipe中内容,避免堵死,但在输出量非常大的情况下会影响性能:
这也是官方文档里推荐的做法,但是不能乱用,因为会影响性能.
解决办法二:
使用文件代替PIPE,但是这样子的话传给客户端的就只能是文件了。
fdout = open(len(procs)+".out", 'w')
fderr = open(len(procs)+".err", 'w')
总结:
两种方法需要自己根据情况进行取舍,都有各自的优势和劣势。
标签:__,Python,pipe,死锁,client,ssh,服务器,日志 来源: https://www.cnblogs.com/strongerLow/p/16426068.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。