2017-03-03 3 views
1

NFSマウントされたファイルシステムにアクセスするPythonプログラムがあります。場合によっては、ファイルシステムがアクセス不能になり、簡単なos.stat( "/ path/to/file")がプロセスをハングします。私は次のタイムアウトラッパースニペットを試しましたが、「悪い」OSシステムコール(悪い意味では戻りません)を扱うときには効果的ではないようです:例えば、動作します:吊るしたプロセスからのタイムアウト

with timeout(seconds=3) 
    sleep(4) 

が、それは動作しません:

with timeout(seconds=3) 
    os.stat("/nfs/mounted/filesystem") 

は、私は絞首刑プロセスのうち、自分自身を蹴ることができ、他の方法はありますか?

class timeout: 
    """ 
    Usage: 
     with timeout(seconds=3): 
      sleep(4) 
    """ 

    def __init__(self, seconds=1, error_message='Timeout'): 
     self.seconds = seconds 
     self.error_message = error_message 

    def handle_timeout(self, signum, frame): 
     raise TimeoutError(self.error_message) 

    def __enter__(self): 
     signal.signal(signal.SIGALRM, self.handle_timeout) 
     signal.alarm(self.seconds) 

    def __exit__(self, type, value, traceback): 
     signal.alarm(0) 

答えて

0

あなたはそれが最適化されていないが、それは動作するはずです、これを試すことができます。

i=0 
while i<200: 
    try: 
     os.stat("/nfs/mounted/filesystem") 
     i=200 
    except: 
     time.sleep(1) 
+0

私はこれがうまくいくとは思わない - 例外はスローされていない。 – python152

0

あなたが例えばのウォッチドッグ・プロセス

を使用することができます。

with timeout(seconds=3) 
    watchdog_queue.put((my_id,timeout=5)) 
    os.stat("/nfs/mounted/filesystem") 
    watchdog_queue.put((my_id,clear)) 

の場合ウォッチドッグプロセス(my_id,clear)メッセージを5秒以内以内に取得するには、my_idを使用してプロセス/スレッドを強制終了してください。

関連する問題