簡體   English   中英

如果NFS服務器已掛載並聯機,請檢入python腳本

[英]Check in python script if NFS server is mounted and online

我有一個類似於檢查NFS共享是否掛載在python腳本中的問題 ,但在我的情況下,NFS服務器已掛載,但服務器崩潰並脫機。 我嘗試使用os.dir.ismount('/path/to/mountpoint/)來考慮這一點但是我的問題是這個命令需要永遠完成。

當我嘗試制作一個簡單的ls /path/to/mountpoint這個命令也沒有完成。 有什么根本錯誤的嗎? 我的設置是一個Linux NFSv3服務器和一個Linux NFS客戶端。

我通常希望如果NFS服務器不可安裝或不再可訪問,則ls命令顯示本地目錄的內容而不是暫停終端。

這種情況發生在NFS上,如果您已經安裝了NFS共享並且服務器不再經常可以通過網絡訪問,那么對安裝的任何IO訪問都會被卡住。 如果你嘗試在終端中運行ls,你會發現它只是卡住,不會失敗只是無休止地等待它永遠不會得到的響應。 所以我建議你做的是在python代碼中運行ls然后設置超時。 達到此超時后,您可以讓它引發異常。 以下是我測試過的實現。 call_timeout是一個函數,它為您提供要執行的命令和超時時間(以秒為單位)。 如果命令在超時之前完成,它會立即返回,否則它會終止它產生的進程,並引發一個可以捕獲的OSError。 你可以選擇返回True或False,這是一個設計選擇。 下面還提供了一些示例調用。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM