我正在使用paramiko
发起ssh
个关联。看来,在运行我的脚本时,一旦建立了连接,它们就不会被关闭。相反,直到TIME_WAIT
在连接终止之前耗尽。我知道TIME_WAIT
代表等待足够的时间来确保远程TCP收到其连接终止请求的确认。
这是我的代码:
#!/usr/local/bin/python2.7
import sys, os, string, threading
import paramiko
paramiko.util.log_to_file("paramiko.log")
cmd = "hostname"
outlock = threading.Lock()
def workon(host):
ssh = paramiko.SSHClient()
key = paramiko.RSAKey.from_private_key_file("./key")
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='user', pkey=key)
stdin, stdout, stderr = ssh.exec_command(cmd)
with outlock:
result = stdout.readlines()
print "{0}".format(hostname[0])
ssh.close()
def main():
with open('./ip_list') as ip:
hosts = ip.read().splitlines()
threads = []
for h in hosts:
t = threading.Thread(target=workon, args=(h,))
t.start()
threads.append(t)
for t in threads:
t.join()
if __name__ == "__main__":
main()
也许这是正常行为但我想确定。在数百个IP地址上运行时,在脚本完成后,有大量的套接字在服务器上保持打开几分钟。
令我困惑的是,套接字在连接时获得ESTABLISHED
,并在之后转到TIME_WAIT
- 即使我没有调用close()
方法。这是预期的行为吗?我是否应该打扰调用close()
方法?有没有“更好”的方法呢?
答案 0 :(得分:1)
TIME_WAIT
是您在干净地关闭连接时应该去的状态。因此,你应该等待,以确保对方看到'你的FIN/ACK
。当你突然退出而没有打电话给close()
时,同样会在清理时发生。
直接使用套接字,您可以立即关闭连接并立即使用'释放资源(如果这是您想要的),但不建议按documentation进行。实际上会发生的事情是,在套接字上调用close()
并没有真正关闭套接字,而是等待GC清理它。结果,RST/ACK
数据包被发送到另一方。因此,它将继续使用资源,直到GC关闭,连接才能正常关闭。