2015-10-01 30 views
1

我正在運行一個腳本,該腳本的telnet爲terminal server。偶爾當一個實例已經在運行,這將導致已經運行腳本失敗與檢查套接字是否在python中使用

EOFError: telnet connection closed

腳本啓動是否有一個快速和容易pythonic的方法來檢查,如果需要的插座已在使用上客戶端電腦在我嘗試打開與telnetlib的連接之前?

SOLUTION:

我想避免一個子進程調用但因爲我沒有在客戶端計算機上控制軟件和其他程序可以使用相同的插槽,下面的文件鎖的建議(好主意)不會爲我工作。我結束了使用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

您可以通過在python中導入subprocess庫來運行以下linux命令netstat | grep 'port number' | wc -l來檢查打開的端口。

1

沒有知道如果服務器有其他打開的連接,你嘗試連接到它以前的標準方式。你必須要求它或者連接到服務器中的另一個服務器來檢查它,或者詢問其他客戶端,如果你知道所有這些服務器。

也就是說,telnet服務器應該能夠一次處理多個連接,所以如果有更多的客戶端連接,應該無關緊要。

+0

我遇到的問題不在服務器端。這是意外地在同一臺客戶機上運行腳本兩次。我的腳本調用'tn = telnetlib.Telnet(host = 10.10.10.15,port = 8001)'。如果腳本在第一次關閉之前再次運行。第一個實例獲取'EOFError:telnet連接關閉'。 – MrPat

+1

@MrPat這是一個服務器端問題,因爲當新服務器到達時,服務器關閉已經存在的連接。你可以用文件鎖來解決這個問題(在腳本運行的時候創建一個文件,並且在開始時,如果文件存在,它不做任何事情就完成了)。 –

+0

不幸的是,這肯定是客戶端問題:如果我在計算機A上運行腳本,然後在A仍在運行時在計算機B上運行腳本,則B的連接嘗試會被服務器拒絕,並且A繼續工作良好。但是,如果我在計算機A上運行腳本(稱爲A1),然後在A上運行腳本(稱爲A2),則A1失敗,並且A2開始新的連接。 A2也會失敗,但是原因不同。 – MrPat

相關問題