2015-10-08 2 views
1

Это может быть плохой практикой, так что простите меня, но когда python закончит исключение non telnet lib или исключение non paramiko (SSH), будет ли соединение SSH или Telnet автоматически закрыто? Кроме того, будет ли sys.exit() закрывать все подключения, которые использует скрипт?Может ли python автоматически закрывать SSH и Telnet

+1

Думаю, вам стоит попытаться закрыть все ваше соединение внутри блока finally, пожалуйста, взгляните на эту ссылку http://stackoverflow.com/questions/7159644/does-paramiko-close-ssh-connection-on-a- non-paramiko-exception – Sanjay

ответ

1

Да, система (Linux и Windows) отслеживает все ресурсы, используемые вашим процессом. Это могут быть файлы, мьютексы, сокеты, что-то еще. Когда процесс умирает, все ресурсы освобождаются. Неважно, какой язык программирования вы используете и как прекратите свое приложение.

Существует несколько незначительных исключений для этого правила, таких как состояние WAIT_CLOSE для сокетов или ресурсов, хранящихся в процессах зомби, но в целом вы можете предположить, что всякий раз, когда ваш процесс завершается, все ресурсы освобождаются.

UPD. Как уже упоминалось в комментариях, ОС не может гарантировать, что ресурсы были освобождены должным образом. В случае сетевых подключений это означает, что нет никакой гарантии, что пакет FIN был отправлен, поэтому, хотя все было очищено на вашем компьютере, удаленная конечная точка все еще может ждать от вас данных. Теоретически он может бесконечно долго ждать. Поэтому всегда лучше использовать инструкцию «finally», чтобы уведомить другую конечную точку о закрытии соединения.

+1

Почему этот ответ был downvote? Это хороший обзор управления ресурсами Linux. – FunkySayu

+0

ОС может отслеживать свои собственные ресурсы уровня ОС, но не знает, как избавиться от произвольных ресурсов, например, от того, что ваше соединение могло быть запущено на удаленной машине. – user2357112

+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 и запустить NetStat только после того, как (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), но c onnexion больше не существует на стороне клиента.

Ответ @ Heller объясняет, почему он работает так.