Я запускаю скрипт, который telnets на terminal server
. Иногда скрипт запускается в то время как один экземпляр уже запущен, который приводит к тому, уже запущен сценарий к неудаче сПроверьте, работает ли сокет в python
EOFError: telnet connection closed
Есть быстрый и простой и pythonic
способ проверить, если требуется сокет уже используется клиентский компьютер, прежде чем пытаться открыть соединение с telnetlib
?
РЕШЕНИЕ:
Я хотел бы избежать принятия подпроцесс вызова, но так как я не контролирую программного обеспечения на клиентских компьютерах, а также другие программы могут использовать тот же сокет, блокировка файла предложение ниже (хорошая идея) не будет работать для меня. Я закончил тем, что использовал предложение SSutrave. Вот мой рабочий код, который использует NETSTAT в Windows 7:
# make sure the socket is not already in use
try:
netstat = subprocess.Popen(['netstat','-nao'],stdout=subprocess.PIPE)
except:
raise ValueError("couldn't launch netstat to check sockets. exiting")
ports = netstat.communicate()[0]
if (ip + ':' + port) in ports:
print 'socket ' + ip + ':' + port + ' in use on this computer already. exiting'
return
Проблема, с которой я столкнулся, не на стороне сервера. Он случайно запускает сценарий дважды на той же машине клиента. Мой скрипт вызывает 'tn = telnetlib.Telnet (host = 10.10.10.15, port = 8001)'. Если сценарий запускается второй раз перед первым закрытием. Первый экземпляр получает сообщение «EOFError: telnet connection closed». – MrPat
@MrPat - проблема на стороне сервера, так как ваш сервер закрывает уже существующие соединения, когда приходит новый. Вы можете обойти это с блокировкой файлов (создать файл во время работы скрипта и при запуске, если файл существует, он заканчивается без каких-либо действий). –
К сожалению, это определенно проблема с клиентской стороной: если я запустил сценарий на компьютере A, а затем на компьютере B, когда A все еще работает, попытка соединения с B отбрасывается сервером, и A продолжает работать отлично. Однако, если я запустил сценарий на компьютере A (вызовите этот A1), а затем снова на A (вызовите этот A2), тогда произойдет сбой A1, а A2 начнет новое соединение. A2 также потерпит неудачу, но по другой причине. – MrPat