8

一般に、NFS クライアントで、Bash シェル スクリプトを使用して、サーバー エンドから Mounted-Point is no more available または DEADを検出する方法を教えてください。

通常、私は:

if ls '/var/data' 2>&1 | grep 'Stale file handle';
then
   echo "failing";
else
   echo "ok";
fi

しかし、問題は、特に NFS サーバーが完全に停止または停止している場合、lsそのディレクトリへのコマンドでさえ、クライアント側でハングまたは停止することです。つまり、上記のスクリプトは使用できなくなります。

これをもう一度検出する方法はありますか?

4

3 に答える 3

10

「stat」コマンドは、ややクリーンな方法です。

statresult=`stat /my/mountpoint 2>&1 | grep -i "stale"`
if [ "${statresult}" != "" ]; then
  #result not empty: mountpoint is stale; remove it
  umount -f /my/mountpoint
fi

さらに、rpcinfo を使用して、リモートの nfs 共有が利用可能かどうかを検出できます。

rpcinfo -t remote.system.net nfs > /dev/null 2>&1
if [ $? -eq 0 ]; then
  echo Remote NFS share available.
fi

2013-07-15T14:31:18-05:00 を追加:

古いマウントポイントを認識する必要があるスクリプトにも取り組んでいるので、これをさらに調べました。「古くなった NFS マウントを検出する良い方法はありますか」に対する回答の 1 つに触発されて、bash で特定のマウントポイントの古さをチェックするには、次の方法が最も信頼できると思います。

read -t1 < <(stat -t "/my/mountpoint")
if [ $? -eq 1 ]; then
   echo NFS mount stale. Removing... 
   umount -f -l /my/mountpoint
fi

「read -t1」コンストラクトは、何らかの理由で stat コマンドがハングした場合、サブシェルを確実にタイムアウトさせます。

2013-07-17T12:03:23-05:00 を追加:

動作しますがread -t1 < <(stat -t "/my/mountpoint")、マウントポイントが古い場合にエラー出力をミュートする方法はないようです。> /dev/null 2>&1サブシェル内またはコマンドラインの最後に追加すると、それが壊れます。簡単なテストを使用する:if [ -d /path/to/mountpoint ] ; then ... fiこれも機能し、スクリプトで使用することをお勧めします。多くのテストの後、それは私が最終的に使用したものです。

2013-07-19T13:51:27-05:00 を追加:

私の質問 " How can I use read timeouts with stat? " への回答には、ターゲットが利用できず、タイムアウトになる前にコマンドが数分間ハングする場合の stat (または rpcinfo) の出力のミュートに関する追加の詳細が記載されています。自分の。古いマウントポイントを[ -d /some/mountpoint ]検出するために使用できますが、rpcinfo には同様の代替手段がないため、read -t1リダイレクトの使用が最適なオプションです。サブシェルからの出力は2>&-でミュートできます。CodeMonkey の応答の例を次に示します。

mountpoint="/my/mountpoint"
read -t1 < <(stat -t "$mountpoint" 2>&-)
if [[ -n "$REPLY" ]]; then
  echo "NFS mount stale. Removing..."
  umount -f -l "$mountpoint"
fi

おそらく今、この質問は完全に答えられています:)。

于 2013-07-14T22:43:37.857 に答える