2015-10-01 2 views
1

Я запускаю скрипт, который 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 

ответ

3

Вы можете проверить открытые порты, выполнив следующую команду linux netstat | grep 'port number' | wc -l, импортировав библиотеку subprocess в python.

1

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

При этом серверы telnet должны иметь возможность обрабатывать более одного соединения за раз, поэтому не имеет значения, подключено ли больше клиентов.

+0

Проблема, с которой я столкнулся, не на стороне сервера. Он случайно запускает сценарий дважды на той же машине клиента. Мой скрипт вызывает 'tn = telnetlib.Telnet (host = 10.10.10.15, port = 8001)'. Если сценарий запускается второй раз перед первым закрытием. Первый экземпляр получает сообщение «EOFError: telnet connection closed». – MrPat

+1

@MrPat - проблема на стороне сервера, так как ваш сервер закрывает уже существующие соединения, когда приходит новый. Вы можете обойти это с блокировкой файлов (создать файл во время работы скрипта и при запуске, если файл существует, он заканчивается без каких-либо действий). –

+0

К сожалению, это определенно проблема с клиентской стороной: если я запустил сценарий на компьютере A, а затем на компьютере B, когда A все еще работает, попытка соединения с B отбрасывается сервером, и A продолжает работать отлично. Однако, если я запустил сценарий на компьютере A (вызовите этот A1), а затем снова на A (вызовите этот A2), тогда произойдет сбой A1, а A2 начнет новое соединение. A2 также потерпит неудачу, но по другой причине. – MrPat

Смежные вопросы