2017-03-03 24 views
1

我有一个python程序访问一个NFS挂接的文件系统。有时候,文件系统变得无法访问,一个简单的os.stat(“/ path/to/file”)会挂起进程。我已经尝试了以下超时包装片段,但在处理“不良”OS系统调用时(它不会返回的意义上的错误),它似乎不起作用:例如,它适用于:从一个挂起的进程超时(卡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