python 是否自动关闭 SSH 和 Telnet
Does python automatically close SSH and Telnet
这可能是不好的做法,所以请原谅我,但是当 python 以非 telnet lib 异常或非 paramiko (SSH) 异常结束时,SSH 或 Telnet 连接会自动关闭吗?另外,sys.exit() 会关闭脚本正在使用的所有连接吗?
是的,系统(Linux 和 Windows)会跟踪您的进程使用的所有资源。它可以是文件、互斥量、套接字或其他任何东西。当进程死亡时,所有资源都被释放。使用哪种编程语言以及如何终止应用程序并不重要。
此规则有几个微妙的例外,例如 WAIT_CLOSE 服务器套接字的状态或僵尸进程持有的资源,但通常您可以假设只要您的进程终止,所有资源都会被释放。
UPD。正如评论中提到的,OS 不能保证资源被正确释放。在网络连接的情况下,这意味着无法保证 FIN 数据包已发送,因此尽管您的机器上的所有内容都已清理,远程端点仍然可以等待您的数据。理论上,它可以无限等待。因此,最好使用 "finally" 语句通知其他端点关闭连接。
在解释器中:
>>> 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 -
现在让我们在 (kill -9 7934 && netstat -putelan | grep ":22"
)
之后终止 Python 和 运行 netstat
tcp 0 0 127.0.0.1:47382 127.0.0.1:22 TIME_WAIT 0 0 -
它没有正确关闭套接字(服务器在 TIME_WAIT),但连接不再存在于客户端。
@Heller 的回答解释了为什么它会这样工作。
这可能是不好的做法,所以请原谅我,但是当 python 以非 telnet lib 异常或非 paramiko (SSH) 异常结束时,SSH 或 Telnet 连接会自动关闭吗?另外,sys.exit() 会关闭脚本正在使用的所有连接吗?
是的,系统(Linux 和 Windows)会跟踪您的进程使用的所有资源。它可以是文件、互斥量、套接字或其他任何东西。当进程死亡时,所有资源都被释放。使用哪种编程语言以及如何终止应用程序并不重要。
此规则有几个微妙的例外,例如 WAIT_CLOSE 服务器套接字的状态或僵尸进程持有的资源,但通常您可以假设只要您的进程终止,所有资源都会被释放。
UPD。正如评论中提到的,OS 不能保证资源被正确释放。在网络连接的情况下,这意味着无法保证 FIN 数据包已发送,因此尽管您的机器上的所有内容都已清理,远程端点仍然可以等待您的数据。理论上,它可以无限等待。因此,最好使用 "finally" 语句通知其他端点关闭连接。
在解释器中:
>>> 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 -
现在让我们在 (kill -9 7934 && netstat -putelan | grep ":22"
)
tcp 0 0 127.0.0.1:47382 127.0.0.1:22 TIME_WAIT 0 0 -
它没有正确关闭套接字(服务器在 TIME_WAIT),但连接不再存在于客户端。
@Heller 的回答解释了为什么它会这样工作。