这可能是不好的做法,请原谅我,但是当python以非telnet lib异常或非paramiko(SSH)异常结束时,SSH或Telnet连接会自动关闭吗?另外,sys.exit()会关闭脚本正在使用的所有连接吗?
答案 0 :(得分:2)
在翻译中:
>>> c = paramiko.SSHClient()
>>> c.connect(hostname="127.0.0.1", username="funkysayu", password="xxxx")
所以在这里,让我们运行netstat -putelan | grep ":22"
:
tcp 0 0 127.0.0.1:47380 127.0.0.1:22 ESTABLISHED 1001 149999 7934/python2
tcp 0 0 127.0.0.1:22 127.0.0.1:47380 ESTABLISHED 0 150000 -
现在让我们杀掉Python,并在(kill -9 7934 && netstat -putelan | grep ":22"
)之后运行netstat
tcp 0 0 127.0.0.1:47382 127.0.0.1:22 TIME_WAIT 0 0 -
它没有正确关闭套接字(服务器在TIME_WAIT中),但是连接不再存在于客户端。
@Heller的回答解释了为什么它会这样工作。
答案 1 :(得分:1)
是的,系统(Linux和Windows)会跟踪您的进程使用的所有资源。它可以是文件,互斥锁,套接字,其他任何东西。当进程终止时,将释放所有资源。使用哪种编程语言以及如何终止应用程序并不重要。
此规则有几个细微的例外,例如服务器套接字的WAIT_CLOSE状态或僵尸进程持有的资源,但一般来说,您可以假设每当您的进程终止时,所有资源都将被释放。
<强> UPD 即可。正如评论中提到的那样,OS无法保证资源被正确释放。在网络连接情况下,这意味着无法保证FIN数据包已发送,因此尽管您的计算机上已清除所有内容,但远程端点仍可等待您的数据。从理论上讲,它可以无限期地等待。因此,最好使用“finally”语句通知另一个端点关闭连接。