2012-12-03 80 views
4

我有類似Check if NFS share is mounted in python script一個問題,但在我的情況下,NFS服務器安裝,但服務器死機和離線去了。我嘗試用os.dir.ismount('/path/to/mountpoint/)但我的問題是,這個命令需要永遠結束到考慮到這一點。入住python腳本,如果NFS服務器安裝和網絡

當我嘗試做一個簡單的ls /path/to/mountpoint此命令還沒有完成。有什麼根本錯誤嗎?我的設置是一個linux NFSv3服務器和一個linux NFS客戶端。

我通常認爲,如果NFS服務器不可卸載或無法訪問,則ls命令將顯示本地目錄的內容而不是終止該終端。

回答

7

這種情況與NFS,如果你已經安裝的NFS共享和服務器不再是網絡訪問經常發生的事情是任何IO訪問安裝只是卡住。如果你嘗試和運行在終端的LS,你會看到它只是卡住,不會失敗只是無休止地等待它永遠不會得到響應。因此,我建議你做的是在你的Python代碼運行ls,然後設置超時。一旦達到這個超時時間,你可能會引發異常。以下是我測試過的一個實現。 call_timeout是你給要執行的命令,並在幾秒鐘的超時時間的函數。如果命令超時之前完成它立即返回,否則就殺死它催生了過程,並提出了一個OSERROR可以捕獲。你可以選擇返回真或假,相反,它是一個設計選擇。下面還提供了一些示例調用。

代碼

from subprocess import Popen, check_output 
import time 

def call_timeout(cmd, timeout): 
    start = time.time() 
    p = Popen(cmd) 
    while time.time() - start < timeout: 
     if p.poll() is not None: 
      return 
     time.sleep(0.1) 
    p.kill() 
    raise OSError('command timed out') 

調用示例

這應該沒有任何錯誤返回:

call_timeout(["sleep", "1"], 0.5) 

這將提高OSERROR錯誤:

call_timeout(["sleep", "1"], 1.5) 

你想要沿着這些路線的東西:

call_timeout(["ls", "/path/to/mountpoint"], 5.0) 
相關問題