これは 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)