A Linux kiszolgáló diagnosztizálása betöltési problémák egy egyszerű szkriptet

A Linux kiszolgáló diagnosztizálása betöltési problémák egy egyszerű szkriptet
A Linux kiszolgáló diagnosztizálása betöltési problémák egy egyszerű szkriptet

Videó: A Linux kiszolgáló diagnosztizálása betöltési problémák egy egyszerű szkriptet

Videó: A Linux kiszolgáló diagnosztizálása betöltési problémák egy egyszerű szkriptet
Videó: Useful Keyboard Shortcuts for Command Prompt in Windows - YouTube 2024, Lehet
Anonim

Ha adminisztrátorként bármilyen időtartamot éltél, biztosan felfedezted azokat a helyzeteket, amikor a kiszolgáló a CPU-használatban vagy a memóriafelhasználásban és / vagy a terhelési szintekben tülekedik. A `top` futása nem mindig ad választ. Tehát hogyan találod azokat a titokzatos folyamatokat, amelyek rágják fel a rendszer erőforrásait, hogy képesek legyenek megölni?

A következő parancsfájl segíthet. Egy webszerverre írták, így vannak olyan részei is, amelyek kifejezetten a httpd folyamatokat és a MySQL-t érintő részeket keresik. A kiszolgáló telepítésétől függően egyszerűen kommentáld / törölheted ezeket a részeket, és másokat is hozzáadhatsz. Ezt kiindulópontként kell használni.

A forgatókönyv ezen verziójára vonatkozó előfeltételek néhány freeware, amelyet a mytop (a https://jeremy.zawodny.com/mysql/mytop/ címen elérhető) GNU Általános Nyilvános Licenc alatt szabadítottak meg, ami egy fantasztikus eszköz a MySQL teljesítményének ellenőrzésére. Öregedik, de még mindig remekül működik a mi céljainkhoz. Ezenkívül a muttet használom levelezőként - érdemes megváltoztatnod a szkriptet, hogy egyszerűen használd a linux beépített `mail` segédprogramot. Óránként cronon futok; állítsa be, ahogy látod. Oh - és ez a parancsfájlnak gyökérként kell futnia, mivel a kiszolgáló egyes védett területeiről olvas.

Szóval induljunk el, mi?

Először állítsa be a szkriptváltozókat:

#!/bin/bash # # Script to check system load average levels to try to determine # what processes are taking it overly high… # # 07Jul2010 tjones # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10

Ezután ellenőrizze a terhelési szintet, hogy lássa, folytatja-e a szkript:

# Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

És folytassa az ellenőrzéseken keresztül, írja az eredményeket az ideiglenes fájlba. Adjon hozzá vagy törölhet elemeket innen, ahol ez a helyzet:

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Figyeljünk a felső parancsra, két temp fájlt írunk. Az egyik a sokkal kisebb üzenet a mobiltelefon. Ha nem szeretné a mobiltelefon riasztásainak sürgősségét háromkor reggel, vegye le ezt (és vegye ki a második levelezési rutint később a forgatókönyvben).

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

További ellenőrzések:

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Ezután írja át az ideiglenes fájl tartalmát egy állandóbb naplófájlba, és küldje el az eredményeket a megfelelő feleknek. A második levelezés az egyszerűsített eredményekből áll, amelyek egyszerűen a "felső" kategóriából származnak:

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

És akkor valami háztartás és kilépés:

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Remélhetőleg ez segít valaki ott. Teljesen összeállított parancsfájl:

#!/bin/bash # # Script to check system load average levels to try to determine what processes are # taking it overly high… # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10 # Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Ajánlott: