Diagnoosi Linux-palvelin lataa ongelmat yksinkertaisella komentosarjalla

Diagnoosi Linux-palvelin lataa ongelmat yksinkertaisella komentosarjalla
Diagnoosi Linux-palvelin lataa ongelmat yksinkertaisella komentosarjalla

Video: Diagnoosi Linux-palvelin lataa ongelmat yksinkertaisella komentosarjalla

Video: Diagnoosi Linux-palvelin lataa ongelmat yksinkertaisella komentosarjalla
Video: OM opetusvideo 4: Kaksoisnäytön asetukset Windows 10:ssä - YouTube 2024, Saattaa
Anonim

Jos olet ollut ylläpitäjä mihinkään aikaan, olet varmasti löytänyt tilanteita, joissa palvelin piilee CPU: n käytössä tai muistin käytössä ja / tai kuormitustasolla. Running `top` ei aina anna sinulle vastausta. Joten miten löydät ne salaiset prosessit, jotka purkavat järjestelmän resursseja voidakseen tappaa heidät?

Seuraava käsikirjoitus voi auttaa. Se on kirjoitettu web-palvelimelle, joten siinä on joitain osia siitä, jotka etsivät erityisesti httpd-prosesseja ja joitain osia, jotka käsittelevät MySQL: tä. Palvelimen käyttöönoton mukaan voit yksinkertaisesti kommentoida / poistaa kyseisiä osioita ja lisätä muita. Sitä tulisi käyttää lähtökohtana.

Tämä skriptiversion edellytys on muutamia freeware-ohjelmia, jotka julkaistiin GNU General Public License -sivustolla nimeltä mytop (saatavilla osoitteessa https://jeremy.zawodny.com/mysql/mytop/), joka on loistava työkalu MySQL: n suorittamien ominaisuuksien tarkistamiseen. Se vanhenee, mutta silti toimii hyvin meidän tarkoituksemme täällä. Lisäksi käytän muttia postilaitteena - voit vaihtaa komentosarjan yksinkertaisesti käyttää `mail` -apuohjelmaan rakennettua linuxia. Juoksin sen kautta cron tunnin välein; säädä sopivaksi. Oh - ja tämä kirjoitus täytyy toimia pääkäyttäjänä, koska se lukee palvelimen tietyistä suojatuista alueista.

Aloitetaan siis, vai mitä?

Määritä ensin skriptimuuttujasi:

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

Seuraavaksi tarkista kuormitustaso ja tarkista, pitäisikö komentosarjan jatkaa:

# 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 jatka tarkastusten kautta kirjoittamalla tulokset väliaikaiseen tiedostoon. Lisää tai poista kohteet täältä, jos se on tilanteessa:

# 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

Huomaa ylimmällä komennolla, kirjoitamme kahteen temp-tiedostoon. Yksi on paljon pienempi viesti matkapuhelimeen. Jos et halua matkapuhelimen hälytysten kiireellisyyttä kolmella aamulla, voit ottaa tämän pois (ja ottaa pois toisen postitusrutiinin myöhemmin komentosarjassa).

# 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

Lisää tarkastuksia:

# 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

Sitten kirjoitetaan tilapäisen tiedoston sisältö pysyvämmäksi lokitiedostoksi ja lähetetään tulokset asianmukaisille osapuolille. Toinen postitus on pared down tulokset, jotka koostuvat yksinkertaisesti standardista `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 sitten jotkut siivous ja poistuminen:

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

# exit 0

Toivottavasti tämä auttaa jokua siellä. Täysin koottu kirjoitus 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

Suositeltava: