간단한 스크립트로 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