3

Check if NFS share ismounted in python scriptのような質問がありますが、私の場合、NFS サーバーはマウントされていますが、サーバーがクラッシュしてオフラインになりました。を使用してこれを考慮に入れようとしましたがos.dir.ismount('/path/to/mountpoint/)、私の問題は、このコマンドが完了するまでに永遠にかかることです。

簡単にしようとすると、ls /path/to/mountpointこのコマンドも終了しません。何か根本的に間違っているのでしょうか?私のセットアップは、Linux NFSv3 サーバーと Linux NFS クライアントです。

通常、NFS サーバーがマウントできないか、到達できない場合、lsコマンドは端末を停止するのではなく、ローカル ディレクトリの内容を表示することを期待しています。

4

1 に答える 1

11

これは 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)
于 2012-12-03T15:11:41.510 に答える