python实时读取⽇志_paramiko使⽤tail实时获取服务器的⽇志
输出详解
基本思路
现在有这么⼀个需求需要实现⾃动化:需要实时获取服务器cpu,gpu温度以及传感器信息上报情况,对⾼低温环境下对于设备运⾏状态的
影响进⾏测试。基本思路为利⽤paramikossh到服务器上,起⼀个线程⽤tail-f命令实时获取⽇志输出,起另外⼀个线程⽤‘cat
/sys/class/thermal/thermal_zone0/temp'命令定时获取cpu,gpu温度。
代码
defget_report_info_perid(lf,cmd,diff_time,thre_time):
#发送要执⾏的命令
pre_time_stamp=[0]*4
lf._(cmd+'r')
#回显很长的命令可能执⾏较久,通过循环分批次取回回显
time_stamp_arr=[]
index=[0]*4
current_line=b''
line_counter=0
line_feed_byte='n'.encode(ng)
whiletrue:
buffer=lf._(1)
iflen(buffer)==0:
('end______________')
break
current_line+=buffer
ifbuffer==line_feed_byte:
line=current_(ng)
('shell显⽰:%s'%line)
with():
line_counter+=1
current_line=b''
continue
col=_type(line)
time_stamp=int((me(''.join([line[:8],line[9:17]]),"%y%m%d%h:%m:%s")))
time_stamp_dec=line[18:21]#精确到毫秒
time_stamp=time_stamp*1000+int(time_stamp_dec)
('%s:%s'%(nior_name[col],time_stamp))
_xl(index[col]+1,col,time_stamp)
index[col]+=1
ifpre_time_stamp[col]==0:
pre_time_stamp[col]=time_stamp
el:
ifabs((time_stamp-pre_time_stamp[col])-diff_time[col])>thre_time[col]:
(
'两帧数据间隔为{}ms,时间戳分别为:({},{}),⾏号:{}'.format(time_stamp-pre_time_stamp[col],time_stamp,pre_time_stamp[col],
index[col]))
pre_time_stamp[col]=time_stamp
line_counter+=1
current_line=b''
defget_temp_info(lf,col,max_number):
index=0
cpu_arr,gpu_arr=[],[]
whiletrue:
cpu_temp,gpu_temp=_cpu_gpu_temp()
('cpu_temp:%s,gpu_temp:%s'%(cpu_temp,gpu_temp))
cpu_(cpu_temp)
gpu_(gpu_temp)
_xl(index+1,col,cpu_temp)
_xl(index+1,col+1,cpu_temp)
(60)
index+=1
ifmax_number==index:
break
returncpu_arr,gpu_arr
遇到问题
1.问题1
⼀开始的cmd命令为|grep-ae“a|b”
结果出现⼀个问题,在代码运⾏⼏分钟之后,就获取不到数据了
⼀开始以为是paramiko的问题,会在⼀定时间之后⾃动关闭client,但是经过调试之后发现是阻塞在_,⼀直收不到服务端的
数据导致。
经过百度之后发现由于linux的缓冲机制影响导致tail-f结合管道|的时候会输出延迟
缓冲是⼀种有效提⾼io效率的⽅法,把频繁的读写请求积累到⼀定程度后再⼀次性的与io设备交互操作。
io缓冲有3种,⽆缓冲,⾏缓冲,和全缓冲。
⽆缓冲,就是不使⽤缓冲机制。⾯向字节的设备?(stderr)
⾏缓冲,缓冲,直到遇到换⾏符。⼀般⽤于终端设备。
全缓冲,缓冲,直到buffer满。⼀般⽤于块设备。
在终端窗⼝中执⾏tail命令,是⾯向终端设备的,会使⽤⾏缓冲,所以⽇志中每写⼊⼀⾏,⽴刻就会输出。
当使⽤管道时,会变为使⽤全缓冲,这样⼀来,就要等到⽇志中写⼊的字节数填满buffer后才会输出。
解决⽅法:
把tail的标准输出重定向到标准错误上,并把标准错误也给管道。
因为stderr是⽆缓冲的。
例如tail-f>&2|grep
或者直接去掉管道
2.问题2
按照问题⼀的结论,我去掉了命令中的管道,直接使⽤命令,将过滤放到check_type函数中进⾏,发现运⾏⼏分钟之后获取
不到数据的情况并没有解决。于是继续定位。最后经过⼀番挫折之后发现是使⽤的tail-f命令有问题
tail-f
等同于–follow=descriptor,根据⽂件描述符进⾏追踪,当⽂件改名或被删除,追踪停⽌
tail-f
等同于–follow=name--retry,根据⽂件名进⾏追踪,并保持重试,即该⽂件被删除或改名后,如果再次创建相同的⽂件名,会继续追踪
⽂件在程序运⾏过程中被修改了⽂件描述符从⽽导致tail-f不继续跟踪。修改为tail-f后问题解决
到此这篇关于paramiko使⽤tail实时获取服务器的⽇志输出的⽂章就介绍到这了,更多相关paramiko⽤tail实时获取服务器⽇志输出内容请搜
索萬仟⽹以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持萬仟⽹!
如您对本⽂有疑问或者有任何想说的,请点击进⾏留⾔回复,万千⽹友为您解惑!
本文发布于:2022-11-16 13:48:13,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/31653.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |