【发布时间】:2019-11-13 18:34:35
【问题描述】:
我想让函数sftp.put() 超时,我尝试过使用信号模块,但如果上传时间超过 10 秒,脚本不会死机。
我用它通过 ssh (paramiko) 传输文件。
[...]
def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't upload the fileeeeeeeeeeee!!!!")
[...]
raspi = paramiko.SSHClient()
raspi.set_missing_host_key_policy(paramiko.AutoAddPolicy())
raspi.connect(ip , username= "", password= "" , timeout=10)
sftp = raspi.open_sftp()
[...]
signal.signal(signal.SIGALRM, handler)
signal.alarm(10)
sftp.put(source, destination , callback=None, confirm=True)
signal.alarm(0)
raspi.close()
[...]
更新 1:
如果服务器停止响应一段时间,我想中止传输。实际上,我的 python 脚本检查(循环)文件夹中的任何文件,并将其发送到这个远程服务器。但是在这里的问题中,我想在服务器在传输过程中突然无法访问的情况下保留此功能(IP 服务器更改,不再有互联网,...)。但是当我模拟断开连接时,脚本仍然停留在这个函数 sftp.put...)
更新 2:
当服务器在传输过程中离线时,put() 似乎永远被阻塞。这行也会发生这种情况:
sftp.get_channel().settimeout(xx)
失去频道怎么办?
更新 3 和脚本目标
Ubuntu 18.04 和 paramiko 版本 2.6.0
你好, 为了遵循您的评论和问题,我必须提供有关我非常丑陋的脚本的更多详细信息,对此感到抱歉:)
实际上,我不想手动杀死一个线程并打开一个新线程。对于我的应用程序,我希望脚本完全自主运行,如果在此过程中出现问题,它仍然可以继续运行。为此,我使用 Python 异常处理。除了远程服务器在传输过程中关闭时,一切都按照我的意愿进行:脚本在 put() 函数中保持阻塞,我认为在循环中。
下面,脚本总共包含 3 个函数来超时,感谢您的帮助,但显然没有什么可以离开这个该死的 sftp.put()!你有什么新想法吗?
Import […]
[...]
def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't upload the fileeeeeeeeeeee!!!!")
def check_time(size, file_size):
global start_time
if (time.time() - start_time) > 10:
raise Exception
i = 0
while i == 0:
try:
time.sleep(1) # CPU break
print ("go!")
#collect ip server
fichierIplist = open("/home/robert/Documents/iplist.txt", "r")
file_lines = fichierIplist.readlines()
fichierIplist.close()
last_line = file_lines [len (file_lines)-1]
lastKnowip = last_line
data = glob.glob("/home/robert/Documents/data/*")
items = len(data)
if items != 0:
time.sleep(60) #anyway
print("some Files!:)")
raspi = paramiko.SSHClient()
raspi.set_missing_host_key_policy(paramiko.AutoAddPolicy())
raspi.connect(lastKnowip, username= "", password= "" , timeout=10)
for source in data: #Upload file by file
filename = os.path.basename(source) #
destination = '/home/pi/Documents/pest/'+ filename #p
sftp = raspi.open_sftp()
signal.signal(signal.SIGALRM, handler)
signal.alarm(10)
sftp.get_channel().settimeout(10)
start_time = time.time()
sftp.put(source, destination, callback=check_time)
sftp.close()
signal.alarm(0)
raspi.close()
else:
print("noFile!")
except:
pass
【问题讨论】: