原因:
使用paramiko庫ssh連接到遠端云主機上時,非常偶現卡死現象,連接無法退出(可以是執行命令時云主機重啟等造成),需要給定一段時間,不管命令執行是否卡住,都退出連接,顯示命令執行超時錯誤,
實作方式:
執行緒+事件,在執行緒中執行ssh命令,給事件配置超時時間,
代碼示例:
1 from threading import Thread, Event
2 import paramiko
1 class SshClient(object): 2 3 def __init__(self, ip, port, username, password): 4 self.ip = ip 5 self.host = host 6 self.username = username 7 self.password = password 8 9 def exec_command(cmd, timeout): 10 log.info(u"在ip:%s上執行命令%s" % (self.ip, cmd)) 11 sc = paramiko.SSHClient() 12 sc.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 13 14 # 用來接收stdout stderror status資訊 15 res = [None, None, None] 16 17 def get_return(start_event, res_list): 18 _, cmd_stdout, cmd_stderr = sc.exec_command(command=cmd, timeout=timeout) 19 channel = cmd_stdout.channel 20 cmd_status = channel.recv_exit_status() 21 res_list[0] = cmd_stdout 22 res_list[1] = cmd_stderr 23 res_list[2] = cmd_status 24 start_event.set() # 表示執行緒已經執行完畢 25 26 try: 27 sc.connect(hostname=self.ip, port=self.port, username=self.username, password=self.password, timeout=30) # 這里的timeout是連接使用的,與我們要的不同 28 start_evt = Event() 29 t = Thread(target=get_return, args=(start_evt, res)) 30 t.start() 31 start_evt.wait(timeout=timeout) 32 # 執行到這里說明執行緒已經退出 33 if None in res: 34 raise Exception(u"命令超時退出") 35 stdout, stderr, status = res 36 if status != 0: 37 raise Exception(u"命令執行回傳非0!回傳值為%s,錯誤資訊為%s" % (status, stdout.read() + stderr.read())) 38 return stdout.read() + stderr.read() 39 finally: 40 sc.close() 41 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265292.html
標籤:其他
