Diagnoosige Linuxi serveri laadimisprobleeme lihtsa skriptiga

Diagnoosige Linuxi serveri laadimisprobleeme lihtsa skriptiga
Diagnoosige Linuxi serveri laadimisprobleeme lihtsa skriptiga

Video: Diagnoosige Linuxi serveri laadimisprobleeme lihtsa skriptiga

Video: Diagnoosige Linuxi serveri laadimisprobleeme lihtsa skriptiga
Video: 30 Ultimate Windows 10 Tips and Tricks for 2020 - YouTube 2024, Aprill
Anonim

Kui olete administraatoriks mingil ajaperioodil, on kindlasti avastanud olukorrad, kus server kasutab CPU-d või mälu ja / või laadimise taset. Käivitamine "top" ei anna teile alati vastust. Niisiis, kuidas sa leiad need alatu protsessid, mis närivad teie süsteemi ressursse, et neid tappa?

Järgmine skript võib olla abiks. See oli kirjutatud veebiserveri jaoks, seega on sellel mõned osad, mis otsivad otseselt httpd-protsesse ja mõnda osa, mis tegelevad MySQL-iga. Sõltuvalt teie serveri kasutuselevõtust, lihtsalt kommenteerige / kustutage need jaotised ja lisage teisi. Seda tuleks kasutada lähtepunktiks.

Selle skripti versiooni eeltingimused on mõni vabavara, mis on avaldatud GNU üldise avaliku litsentsi all mytop (saadaval aadressil https://jeremy.zawodny.com/mysql/mytop/), mis on suurepärane vahend MySQL toimivuse kontrollimiseks. See muutub vanaks, kuid siiani sobib hästi meie eesmärkide saavutamiseks. Lisaks kasutan mutt e-posti aadressina - võite soovida skripti muuta, et lihtsalt kasutada "mail" utiliidi ehitatud linuxit. Ma jooksin selle kaudu croni iga tund; kohandage nii, nagu see sobib. Oh - ja see skript peab käivituma rootena, sest see loeb serveri mõnda kaitstud ala.

Nii et alustame, kas me peame?

Esiteks määra oma skripti muutujad:

#!/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

Seejärel kontrollige oma laadimise taset, et näha, kas skript peaks jätkuma:

# 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

Ja jätkake kontrolli kaudu, kirjutades tulemused ajutisse faili. Siin lisage või kustutage üksused siit, kui see on teie olukorrale sobiv:

# 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

Märkus tippjuhtimisega, kirjutame kahte temp faili. Üks on mobiiltelefonile palju väiksema sõnumi saamiseks. Kui te ei soovi mobiiltelefoni häirete kiireloomulisust kolm hommikul, võite selle välja võtta (ja võtta skriptis hiljem teine e-posti rutiin).

# 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

Veel kontrollid:

# 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

Seejärel kirjutage ajutise faili sisu alalisse logifaili ja saatke tulemused vastavatele osapooltele. Teine postitus on parameetrid, mis koosnevad lihtsalt standardist "top":

# 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

Ja siis mõned majapidamine ja väljumine:

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

# exit 0

Loodetavasti aitab see keegi seal. Täielikult kokku pandud skript on:

#!/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

Soovitan: