91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

服務器的日志輸出怎么利用paramiko進行實時獲取

發布時間:2020-12-07 14:59:25 來源:億速云 閱讀:241 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關服務器的日志輸出怎么利用paramiko進行實時獲取,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

具體方法如下:

 def get_report_info_perid(self, cmd, diff_time, thre_time):
  # 發送要執行的命令
  pre_time_stamp = [0] * 4
  self._channel.send(cmd + '\r')
  # 回顯很長的命令可能執行較久,通過循環分批次取回回顯
  time_stamp_arr = []
  index = [0] * 4
  current_line = b''
  line_counter = 0
  line_feed_byte = '\n'.encode(self.encoding)
  while True:
   buffer = self._channel.recv(1)
   if len(buffer) == 0:
    logger.info('end______________')
    break
   current_line += buffer
   if buffer == line_feed_byte:
    line = current_line.decode(self.encoding)
    logger.debug('shell顯示:%s'%line)
    if not line.startswith(self.rq):
     line_counter += 1
     current_line = b''
     continue
    col = self.check_type(line)
    time_stamp = int(time.mktime(time.strptime(' '.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)
    logger.info('%s:%s' % (senior_name[col], time_stamp))
    self.write_xl(index[col] + 1, col, time_stamp)
    index[col] += 1
    if pre_time_stamp[col] == 0:
     pre_time_stamp[col] = time_stamp
    else:
     if abs((time_stamp - pre_time_stamp[col]) - diff_time[col]) > thre_time[col]:
      logger.error(
       '兩幀數據間隔為{}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''


 def get_temp_info(self, col, max_number):
  index = 0
  cpu_arr, gpu_arr = [], []
  while True:
   cpu_temp, gpu_temp = self.get_cpu_gpu_temp()
   logger.info('cpu_temp:%s, gpu_temp:%s' % (cpu_temp, gpu_temp))
   cpu_arr.append(cpu_temp)
   gpu_arr.append(gpu_temp)
   self.write_xl(index + 1, col, cpu_temp)
   self.write_xl(index + 1, col + 1, cpu_temp)
   time.sleep(60)
   index += 1
   if max_number == index:
    break
  return cpu_arr, gpu_arr

遇到問題

1.問題1

一開始的cmd命令為 tail -f log.txt | grep -aE “a|b”

結果出現一個問題,在代碼運行幾分鐘之后,就獲取不到數據了

一開始以為是paramiko的問題,會在一定時間之后自動關閉client,但是經過調試之后發現是阻塞在_channel.recv,一直收不到服務端的數據導致。

經過百度之后發現由于linux的緩沖機制影響導致tail -f 結合管道|的時候會輸出延遲

緩沖是一種有效提高IO效率的方法,把頻繁的讀寫請求積累到一定程度后再一次性的與IO設備交互操作。

IO緩沖有3種,無緩沖,行緩沖,和全緩沖。

  • 無緩沖,就是不使用緩沖機制。面向字節的設備?(stderr)
  • 行緩沖,緩沖,直到遇到換行符。一般用于終端設備。
  • 全緩沖,緩沖,直到buffer滿。一般用于塊設備。

在終端窗口中執行tail命令,是面向終端設備的,會使用行緩沖,所以日志中每寫入一行,立刻就會輸出。

當使用管道時,會變為使用全緩沖,這樣一來,就要等到日志中寫入的字節數填滿buffer后才會輸出。

解決方法:

把tail的標準輸出重定向到標準錯誤上,并把標準錯誤也給管道。

因為stderr是無緩沖的。

例如 tail -f >&2 | grep

或者直接去掉管道

2.問題2

按照問題一的結論,我去掉了命令中的管道,直接使用 tail -f log.txt命令,將過濾放到check_type函數中進行,發現運行幾分鐘之后獲取不到數據的情況并沒有解決。于是繼續定位。最后經過一番挫折之后發現是使用的tail -f命令有問題

tail -f

等同于–follow=descriptor,根據文件描述符進行追蹤,當文件改名或被刪除,追蹤停止

tail -F

等同于–follow=name --retry,根據文件名進行追蹤,并保持重試,即該文件被刪除或改名后,如果再次創建相同的文件名,會繼續追蹤

log.txt文件在程序運行過程中被修改了文件描述符從而導致tail -f不繼續跟蹤。修改為tail -F后問題解決

上述就是小編為大家分享的服務器的日志輸出怎么利用paramiko進行實時獲取了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽阳市| 通许县| 太保市| 曲水县| 秦安县| 昌乐县| 黄梅县| 长泰县| 甘孜| 沅江市| 芷江| 新余市| 尼勒克县| 宿迁市| 景东| 南宁市| 六盘水市| 南皮县| 灯塔市| 沭阳县| 彭泽县| 青岛市| 绥宁县| 宜宾市| 凤凰县| 灵宝市| 霍山县| 卓资县| 西乌珠穆沁旗| 桃江县| 济源市| 阿拉善左旗| 丽水市| 霍林郭勒市| 皋兰县| 吴堡县| 泰和县| 丹巴县| 汝州市| 宝鸡市| 博野县|