홈페이지 » 어떻게 » 간단한 스크립트로 Linux 서버로드 문제 진단

    간단한 스크립트로 Linux 서버로드 문제 진단

    어느 정도의 기간 관리자가되어 있다면 CPU가 CPU 사용량이나 메모리 사용률 및 / 또는로드 수준에서 급증하는 상황을 확실히 발견하게됩니다. 'top'을 실행해도 항상 답을 줄 수는 없습니다. 그렇다면 시스템 리소스를 씹고있는 부적절한 프로세스를 어떻게 찾을 수 있습니까??

    다음 스크립트가 도움이 될 수 있습니다. 웹 서버용으로 작성되었으므로 특별히 httpd 프로세스를 찾고있는 부분과 MySQL을 다루는 부분이 있습니다. 서버 배치에 따라 해당 섹션을 주석 처리 / 삭제하고 다른 섹션을 추가하기 만하면됩니다. 출발점으로 사용해야합니다..

    이 버전의 스크립트에 대한 전제 조건은 MySQL이 어떻게 작동 하는지를 확인하는 환상적인 도구 인 mytop (http://jeremy.zawodny.com/mysql/mytop/에서 구할 수 있음)이라는 GNU 일반 공중 사용 허가서에 따라 프리웨어입니다. 그것은 늙어 가고 있지만, 우리의 목적을 위해 여전히 훌륭하게 작동합니다..
    또한 메일러로 mutt을 사용합니다. 스크립트를 변경하여 'mail'유틸리티에 내장 된 Linux를 사용하기를 원할 수도 있습니다. 매 시간마다 cron을 통해 실행합니다. 적합하다고 생각하는대로 조정하십시오. 오 -이 스크립트는 서버의 일부 보호 영역에서 읽히기 때문에 루트로 실행해야합니다..

    시작하자.?

    먼저 스크립트 변수를 설정하십시오.

    #! / bin / bash
    #
    # 시스템로드 평균 수준을 확인하여 확인하려고하는 스크립트
    # 어떤 프로세스가 지나치게 높은 수준으로 가져 가고 있는지 ...
    #
    # 07Jul2010 tjones
    #
    # 환경 설정
    dt = "날짜 + % d % b % Y- % X"
    # 물론, 다음 디렉토리를 로그 파일이 실제로 저장되는 위치로 변경하십시오
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    첫 번째 메일 정지는 보고서의 표준 이메일입니다. 두 번째 것은 휴대 전화 용입니다 (보고서 다운 다운)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "호스트 이름"
    # 다음 세 가지는 mytop 사용을위한 것입니다 - 괜찮은 권한을 가진 db 사용자를 사용하십시오
    dbusr = "사용자 이름"
    dbpw = "암호"
    db = "yourdatabasename"
    # 다음은 점검 할로드 레벨입니다 - 10이 실제로 높기 때문에 낮추고 싶을 수도 있습니다.
    levelToCheck = 10

    다음으로로드 수준을 확인하여 스크립트가 계속 진행되는지 확인하십시오.

    # 시스템에서 변수 설정 :
    loadLevel = "cat / proc / loadavg | awk"print $ 1 "
    loadLevel = $ (printf "% 0.f"$ loadLevel)

    #로드 수준이 원하는 것보다 크면 스크립트 프로세스를 시작하십시오. 그렇지 않으면 0을 종료합니다.

    if [$ loadLevel -gt $ levelToCheck]; 그때
    echo ""> $ tmpfile
    echo "*************************************">> $ tmpfile
    echo "Date : $ dt">> $ tmpfile
    echo "시스템로드 및 프로세스 확인">> $ tmpfile
    echo "*************************************">> $ tmpfile

    수표를 통해 계속 진행하여 결과를 임시 파일에 씁니다. 상황에 따라 여기에서 항목을 추가하거나 삭제하십시오.

    # 시스템에서 더 많은 변수 얻기 :
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # 현재로드 수준 표시 :
    echo "로드 레벨 : $ loadLevel">> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile

    # 현재 실행중인 httpd 프로세스의 수를 표시합니다 (하위 항목 제외).
    echo "지금 httpd 프로세스의 수 : $ httpdProcesses">> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 프로세스 목록 표시 :
    echo "현재 실행중인 프로세스 :">> $ tmpfile
    ps f -ef >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 현재 MySQL 정보 표시 :
    echo "mytop의 결과 :">> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    top 커맨드와 함께, 우리는 두 개의 임시 파일에 쓰고 있습니다. 하나는 휴대 전화보다 훨씬 작은 메시지입니다. 아침 3시에 휴대 전화 알림의 긴박감을 원하지 않는다면, 이것을 꺼낼 수 있습니다 (나중에 스크립트에서 두 번째 메일 링 루틴을 꺼내십시오).


    # 현재 상단 표시 :
    echo "top 이제 보여줍니다 :">> $ tmpfile
    echo "top은 다음을 보여줍니다 :">> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    더 많은 수표 :


    # 현재 연결 표시 :
    echo "netstat에 다음과 같이 표시됩니다 :">> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 디스크 공간 확인
    echo "디스크 공간 :">> $ tmpfile
    / bin / df -k >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    그런 다음 임시 파일 내용을보다 영구적 인 로그 파일에 기록하고 결과를 해당 당사자에게 전자 메일로 보냅니다. 두 번째 메일 링은 단순한 '최고'표준으로 구성된 결과입니다.

    # 결과를 로그 파일로 보내기 :
    / bin / cat $ tmpfile >> $ logfile

    # 그리고 결과를 sysadmin에게 이메일로 보내라 :
    / usr / bin / mutt -s "$ machine의 부하가 높습니다! - $ dt"-a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    그리고 약간의 관리와 퇴장 :

    # 그런 다음 임시 파일을 제거하십시오.
    rm $ tmpfile
    rm $ topfile
    fi

    #
    출구 0

    희망적으로 이것은 누군가를 도울 수 있기를 바랍니다. 완전히 조립 된 스크립트는 다음과 같습니다.

    #! / bin / bash
    #
    # 프로세스가 어떤 것인지 결정하기 위해 시스템로드 평균 수준을 확인하는 스크립트
    # 지나치게 높은 걸로 ...
    #
    # 환경 설정
    dt = "날짜 + % d % b % Y- % X"
    # 물론, 다음 디렉토리를 로그 파일이 실제로 저장되는 위치로 변경하십시오
    tmpfile = "/ tmp / checkSystemLoad.tmp"
    logfile = "/ tmp / checkSystemLoad.log"
    msgLog = "/ var / log / messages"
    mysqlLog = "/ var / log / mysqld.log"
    첫 번째 메일 정지는 보고서의 표준 이메일입니다. 두 번째 것은 휴대 전화 용입니다 (보고서 다운 다운)
    mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    machine = "호스트 이름"
    # 다음 세 가지는 mytop 사용을위한 것입니다 - 괜찮은 권한을 가진 db 사용자를 사용하십시오
    dbusr = "사용자 이름"
    dbpw = "암호"
    db = "yourdatabasename"
    # 다음은 점검 할로드 레벨입니다 - 10이 실제로 높기 때문에 낮추고 싶을 수도 있습니다.
    levelToCheck = 10
    # 시스템에서 변수 설정 :
    loadLevel = "cat / proc / loadavg | awk"print $ 1 "
    loadLevel = $ (printf "% 0.f"$ loadLevel)

    #로드 수준이 원하는 것보다 크면 스크립트 프로세스를 시작하십시오. 그렇지 않으면 0을 종료합니다.

    if [$ loadLevel -gt $ levelToCheck]; 그때
    echo ""> $ tmpfile
    echo "*************************************">> $ tmpfile
    echo "Date : $ dt">> $ tmpfile
    echo "시스템로드 및 프로세스 확인">> $ tmpfile
    echo "*************************************">> $ tmpfile

    # 시스템에서 더 많은 변수 얻기 :
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # 현재로드 수준 표시 :
    echo "로드 레벨 : $ loadLevel">> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile

    # 현재 실행중인 httpd 프로세스의 수를 표시합니다 (하위 항목 제외).
    echo "지금 httpd 프로세스의 수 : $ httpdProcesses">> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 프로세스 목록 표시 :
    echo "현재 실행중인 프로세스 :">> $ tmpfile
    ps f -ef >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 현재 MySQL 정보 표시 :
    echo "mytop의 결과 :">> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 현재 상단 표시 :
    echo "top 이제 보여줍니다 :">> $ tmpfile
    echo "top은 다음을 보여줍니다 :">> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 현재 연결 표시 :
    echo "netstat에 다음과 같이 표시됩니다 :">> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 디스크 공간 확인
    echo "디스크 공간 :">> $ tmpfile
    / bin / df -k >> $ tmpfile
    에코 "*********************************************** * ">> $ tmpfile
    echo "">> $ tmpfile

    # 결과를 로그 파일로 보내기 :
    / bin / cat $ tmpfile >> $ logfile

    # 그리고 결과를 sysadmin에게 이메일로 보내라 :
    / usr / bin / mutt -s "$ machine의 부하가 높습니다! - $ dt"-a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile

    # 그런 다음 임시 파일을 제거하십시오.
    rm $ tmpfile
    rm $ topfile
    fi

    #
    출구 0