2013-07-12 18 views
7

일반적으로 NFS 클라이언트에서 마운트 포인트를 감지하는 방법은 더 이상 사용할 수 없거나 서버 끝에서 DEAD를 배쉬 쉘 스크립트를 사용하여 감지합니까?Linux 쉘 스크립트 : NFS 탑재 지점 (또는 서버)을 감지하는 방법이 작동하지 않습니까?

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

그러나 특히 NFS 서버가 완전히 죽었거나 교수형 클라이언트 측에서 해당 디렉토리에, 심지어, ls 명령을 중지하거나 죽었을 때 문제가 있습니다 :

은 일반적으로 내가 할. 위의 스크립트는 더 이상 쓸모가 없습니다.

다시이를 감지 할 수있는 방법이 있습니까?

답변

10

"통계"는 명령은 다소 청소기 방법입니다

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

추가 2013-07-15T14 : 원격 NFS 공유를 사용할 수 있는지 여부를 감지 할 수있는 rpcinfo를 사용할 수 있습니다, 또한

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 

: 31 : 18-05 : 00 :

부실 마운트 포인트를 인식해야하는 스크립트 작업도 진행하면서이 문제에 대해 더 자세히 살펴 보았습니다.

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

"-t1 읽어 one of the replies에서 영감을"부실 NFS 마운트를 감지 할 수있는 좋은 방법이 있나요 ", 나는 다음은 bash는 특정 마운트 지점의 실효를 확인하는 가장 신뢰할 수있는 방법이 될 것 같아요 "어떤 이유로 든 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 :

합계 (또는있는 rpcinfo)의 출력을 음소거에 대한 추가 세부 사항을 제공하는 내 질문에 "How can I use read timeouts with stat?"에 대한 응답 대상을 사용할 수 없습니다 자체적으로 시간 초과되기 전에 명령이 몇 분 동안 중단됩니다. 부실 마운트 포인트를 탐지하려면 [ -d /some/mountpoint ]을 사용할 수 있지만 rpcinfo에 대한 유사한 대안은 없으므로 read -t1 리디렉션을 사용하는 것이 가장 좋습니다. 서브 쉘의 출력은 2> & -으로 음소거 될 수 있습니다. 여기 CodeMonkey's response의 예는 다음과 같습니다

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

아마도 지금이 질문에 대해 충분한 답변이됩니다 :).

+0

내 스크립트 ** nfs_automount ** [GitHub에서 사용할 수 있음] (https://github.com/vwal/nfs_automount)에서 부실 NFS 마운트 지점 감지를 사용했습니다. – Ville

+3

좋은 답변입니다. read -t1 <(stat -t "$ MOUNT_DIR"2> & -)'가'142'의 반환 값을 제공하는 것을 보았습니다. 그래서'[! $? -eq 0]'을 사용하는 것이 좋습니다. – psiphi75

+3

다른 점 :'-t1 <(stat -t "$ mountpoint"2> &&)'는 마운트 된 폴더에 열려있는 파일 핸들을 남긴다. 그러므로'-l' 플래그를 사용하지 않으면 마운트 옵션이 실패합니다. 대신에'timeout 1 stat -t "$ mountpoint">/dev/null'을 사용할 수 있습니다. 이것은'stat' 명령을 죽일 것이고 따라서 그것은 열린 파일 핸들을 죽일 것입니다. – psiphi75

1

Ville과 CodeMonkey의 최종 답변은 거의 정확합니다. 나는 아무도 이것을 알아 차리지 못했지만 $ REPLY 문자열 은 성공을 의미합니다. 성공은입니다. 따라서 비어있는 $ REPLY 문자열은 마운트가 부실임을 의미합니다.따라서 조건부는 -n이 아닌 -z를 사용해야합니다.

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

유효한 마운트 포인트와 유효하지 않은 마운트 포인트로 여러 번 실행했는데 작동합니다. -n 검사는 절대적으로 유효 할 때 마운트가 부실하다는 것을 나타내는 반향 결과를 보냈습니다.

또한 간단한 문자열 검사에는 이중 대괄호가 필요하지 않습니다.