paramiko는tail을 사용하여 서버의 로그 출력을 실시간으로 가져옵니다.
기본 사고방식
현재 이러한 수요는 자동화를 실현해야 한다. 서버 cpu, gpu 온도와 센서 정보를 실시간으로 얻고 고저온 환경에서 설비 운행 상태에 대한 영향을 테스트해야 한다.기본적인 사고방식은paramikossh를 이용하여 서버에 연결합니다. 하나의 루트는tail-f 명령으로 로그 출력을 실시간으로 가져오고, 다른 루트는'cat/sys/class/thermal/thermal_zone0/temp 명령 시 cpu, gpu 온도를 가져옵니다.
코드
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 = '
'.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-flog입니다.txt | grep -aE “a|b”
결과적으로 문제가 발생했습니다. 코드가 몇 분 동안 실행된 후에 데이터를 얻을 수 없습니다.
처음에는 파라미코 문제라고 생각했는데 일정 시간 후에 클라이언트를 자동으로 닫았지만 디버깅을 해보니 막혔어요_channel.recv, 서비스 측의 데이터를 받지 못해서
바이두를 통해 linux의 버퍼 메커니즘의 영향으로 tail-f 결합 파이프 | 시 출력 지연
버퍼링은 IO 효율을 효과적으로 향상시키는 방법으로 빈번한 읽기와 쓰기 요청을 어느 정도 축적한 후에 IO 장치와 한꺼번에 상호작용을 한다.
IO 버퍼는 버퍼, 행 버퍼, 전체 버퍼가 없는 세 가지가 있습니다.
파이프를 사용할 때, 모든 버퍼를 사용합니다. 그러면 로그에 기록된 바이트 수가 버퍼를 채워야 출력됩니다.
해결 방법:
tail의 표준 출력을 표준 오류로 바꾸고 표준 오류도 파이프에 줍니다.
stderr는 버퍼가 없기 때문이다.
예를 들어tail-f>&2 | grep
아니면 그냥 파이프를 없애거나.
2. 질문 2
문제 1의 결론에 따라 나는 명령의 파이프를 제거하고tail-flog를 직접 사용했다.txt 명령, 필터를 check_type 함수에서 진행되었습니다. 몇 분 동안 실행한 후에 데이터를 얻을 수 없는 상황이 해결되지 않았습니다.그래서 계속 위치를 정한다.마지막 좌절 끝에 사용한 tail-f 명령에 문제가 있는 거예요.
tail -f
Cfollow=descriptor와 같고 파일 설명자에 따라 추적합니다. 파일이 개명되거나 삭제되면 추적이 정지됩니다.
tail -F
Cfollow=name --retry와 같습니다. 파일 이름에 따라 추적하고 다시 시도하십시오. 즉, 이 파일이 삭제되거나 이름이 바뀐 후에 같은 파일 이름을 다시 만들면 계속 추적합니다.
log.txt 파일은 프로그램 실행 과정에서 파일 설명자를 수정하여tail-f가 계속 추적하지 않습니다.tail-F로 수정 후 문제 해결
파라미코가 테일을 사용하여 서버의 로그 출력을 실시간으로 얻는 것에 관한 이 글은 여기까지 소개되었습니다. 더 많은 파라미코가 테일로 서버의 로그 출력 내용을 실시간으로 얻는 것에 관해서는 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보시기 바랍니다. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python은paramiko를 이용하여 서버 명령을 실행하는 방법말이 많지 않으면 바로 코드를 찍는다. 봉인 연결 서버에서 명령 실행 서버에 파일 보내기 능력에 한계가 있으니, 만약 부적당하면 메시지를 남겨 시정해 주십시오 이상은python이paramiko를 어떻게 이용하여 서버...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.