nfs 연결 고장 자동 검색 및 복구 프로그램

3558 단어 linuxshellnfsmountdf
더 읽 기
비 즈 니스 장면
       응용 프로그램 간 에 파일 을 인터페이스 로 하여 디자인 을 간소화 하기 위해 단독 파일 전송 모듈 을 사용 하지 않 고 공용 nfs 서버 방식 으로 시스템 차원 에서 파일 의 업로드 와 다운 로드 를 자동 으로 완성 합 니 다. 그러나 유지 단계 에서 nfs 가 연결 할 수 없 는 문제 가 자주 발생 하여 응용 프로그램 io 오류 가 발생 하여 업무 의 정상 적 인 추진 에 영향 을 주 었 습 니 다.
 
원인 분석
       1 > 클 라 이언 트 관리자 가 모 르 는 상황 에서 nfs server 가 있 는 서버 를 다시 시작 하여 원래 의 연결 점 이 nfs server 에 접근 할 수 없 게 되 었 습 니 다. 다시 mount 해 야 합 니 다.
       2 > nfs client 엔 드 호스트 를 다시 시작 합 니 다. 자동 mount 나 mount 가 실패 하지 않 아 프로그램 이 잘못 되 었 습 니 다.
       3 > 네트워크 고장 으로 nfs 연결 이 사용 되 지 않 음
 
대책
       셸 프로그램 을 통 해 nfs mount 의 상황 을 정시 에 자동 으로 감지 합 니 다.
 
프로그램 구현
       평소 nfs 를 수 동 으로 확인 할 때 df 명령 을 사용 합 니 다. nfs 연결 에 문제 가 있 으 면 동기 화 IO 이기 때문에 df 는 nfs 연결 이 가능 할 때 까지 기 다 려 야 합 니 다. 따라서 이번 프로그램 은 df 명령 의 실행 상황 을 통 해 nfs 가 정상 인지 아 닌 지 를 판단 합 니 다. 단, 두 프로 세 스 를 통 해 이 루어 져 야 합 니 다. 만약 에 한 프로 세 스 가 있 으 면 df 명령 카드 가 그곳 에 죽 으 면...프로그램 전체 가 거기에 걸 려 움 직 이지 않 기 때문에 셸 프로그램 두 개가 필요 합 니 다.
 
1. 주 셸 프로그램
       하위 셸 프로그램 을 호출 하여 하위 셸 프로그램 을 배경 에서 실행 하도록 합 니 다.
       sleep 30 초 후 pid 를 통 해 하위 셸 프로 세 스 가 종료 되 었 는 지 확인 합 니 다.
        하위 프로 세 스 가 있 으 면 nfs 연결 에 이상 이 생 겼 음 을 설명 하고 이상 exit 2 로 돌아 갑 니 다.
                메모: kill 하위 셸 프로 세 스 가 없습니다. nfs mount 가 성공 하면 df 가 성공 적 으로 돌아 갑 니 다. 하위 프로 세 스 는 자동 으로 종 료 됩 니 다. 물론 수 동 으로 kill 할 수도 있 습 니 다.
        하위 프로 세 스 가 없 으 면 df | grep 명령 을 더 실행 하여 mount 연결 점 이 존재 하 는 지 확인 하 십시오.
        mount 연결 점 이 존재 하지 않 으 면 mount 명령 을 실행 하여 연결 합 니 다.
        마 운 트 에 성공 하면 성공 exit 0 으로 돌아 갑 니 다.
        mount 에 실패 하면 이상 exit 1 로 돌아 갑 니 다.
  
2. 하위 셸 프로그램
       pid 를 파일 에 기록 합 니 다.
       df 명령 실행
 
주 프로그램
 
#!/bin/sh

echo "checknfs.sh start..."

workdir="/home/wk"
mdirdown="/data/download"
mdirup="/data/upload"
remoteip=1.2.3.4
rcdown=0
rcup=0

cd $workdir
sh ./checkdf.sh&

sleep 30

pid=`cat checkdfpid.log`
echo "got checkdf.sh pid is:"$pid
ps -p $pid
if [ $? -ne 0 ];
then
    downcount=`df|grep $mdirdown|wc -l`
    upcount=`df|grep $mdirup|wc -l`
	if [ $downcount -ge 1 ] && [ $upcount -ge 1 ];
	then
        echo "checknfs.sh end normally..."
        exit 0
	else
	    if [ $downcount -lt 1 ];
		then
		    mount  $remoteip:$mdirdown  $mdirdown
			rcdown=$?
			
			if [ $rcdown -ne 0 ];
			then
	            echo "(mount fail) -> "$mdirdown
			fi
		fi
        
        if [ $upcount -lt 1 ];
		then
		    mount  $remoteip:$mdirup  $mdirup
			rcup=$?
			if [ $rcup -ne 0 ];
			then
    	        echo "(mount fail) -> "$mdirup
			fi
		fi		
        
		if [ $rcdown -eq 0 ] && [ $rcup -eq 0 ];
	    then
		    echo "checknfs.sh end normally(remounted)..."
		    exit 0
		else
		    echo "checknfs.sh end abnormally(mount fail)..."
		    exit 1
		fi
	fi
else
	echo "checknfs.sh end abnormally(df block)..."
	exit 2
fi

 
서브루틴
 
#!/bin/sh

echo "checkdf.sh start..."
echo 'checkdf pid:'$$
echo $$ > checkdfpid.log

df

echo "checkdf.sh end normally..."

좋은 웹페이지 즐겨찾기