Diagnóza problémov s načítavaním servera Linux s jednoduchým skriptom
Ak ste administrátorom po určitú dobu, určite ste zistili situácie, keď server narastá v používaní CPU alebo využití pamäte a / alebo úrovniach načítania. Spustenie "top" vám nie vždy poskytne odpoveď. Takže, ako nájdeš tie záludné procesy, ktoré žutia systémové zdroje, aby si ich mohol zabiť??
Nasledujúci skript by mohol pomôcť. Bol napísaný pre webový server, takže niektoré jeho časti konkrétne hľadajú procesy httpd a niektoré časti, ktoré sa zaoberajú MySQL. V závislosti od nasadenia servera stačí komentovať / odstrániť tie časti a pridať ďalšie. Mal by sa použiť ako východiskový bod.
Predpoklady pre túto verziu skriptu sú niektoré freeware vydané pod GNU General Public License s názvom mytop (k dispozícii na adrese http://jeremy.zawodny.com/mysql/mytop/), čo je skvelý nástroj na kontrolu fungovania MySQL. Stárne, ale stále funguje skvelo pre naše účely tu.
Navyše používam mutt ako poštový priečinok - možno budete chcieť zmeniť skript jednoducho pomocou linuxu postaveného v utilitách 'mail'. Spúšťam to cez cron každú hodinu; upravte podľa vlastného uváženia. Oh - a tento skript musí bežať ako root, pretože číta z niektorých chránených oblastí servera.
Takže začnime, budeme?
Najprv nastavte premenné skriptu:
#! / Bin / bash
#
# Script skontrolovať priemernú úroveň zaťaženia systému, aby ste sa pokúsili zistiť
# aké procesy to robia príliš vysoko ...
#
# 07Jul2010 tjones
#
# nastavené prostredie
dt = "dátum +% d% b% Y-% X"
# Zrejme, zmeňte nasledujúce adresáre na miesto, kde sa skutočne uchovávajú vaše súbory denníka
tmpfile = "/ TMP / checkSystemLoad.tmp"
logfile = "/ TMP / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# prvý mailstop je štandardný e-mail pre správy. Druhá je pre mobilný telefón (so zdieľanou správou)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
Stroj = "hostiteľa"
# Nasledujúce tri sú pre mytop použitie - používajte db užívateľa, ktorý má slušné práva
dbusr = "meno"
dBpW = "password"
db = "yourdatabasename"
# Nasledujúce je úroveň zaťaženia na kontrolu - 10 je naozaj vysoká, takže ho možno budete chcieť znížiť.
levelToCheck = 10
Ďalej skontrolujte úroveň zaťaženia a zistite, či skript by mal pokračovať:
# Nastaviť premenné zo systému:
loadLevel = "cat / proc / loadavg | awk" tlač $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# ak je úroveň zaťaženia vyššia, než chcete, spustite proces skriptu. V opačnom prípade opustite 0
ak [$ loadLevel -gt $ levelToCheck]; potom
echo ""> $ tmpfile
echo "****************************************" >> $ tmpfile
echo "Dátum: $ dt" >> $ tmpfile
echo "Kontrola zaťaženia a procesov systému" >> $ tmpfile
echo "****************************************" >> $ tmpfile
A pokračujte v kontrolách a napíšte výsledky do dočasného súboru. Pridajte alebo odstráňte položky tam, kde je to vhodné pre vašu situáciu:
# Získajte ďalšie premenné zo systému:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Zobraziť aktuálnu úroveň zaťaženia:
echo "Úroveň zaťaženia je: $ loadLevel" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile# Zobraziť počet bežiacich procesov httpd (bez detí):
echo "Počet procesov httpd teraz: $ httpdProcesses" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobraziť zoznam procesov:
echo "Prebiehajúce procesy:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobraziť aktuálne informácie o MySQL:
echo "Výsledky z mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile
Všimnite si príkaz top, píšeme dva dočasné súbory. Jedna je pre oveľa menšie správy na mobilný telefón. Ak nechcete naliehavosť upozornení na mobilné telefóny o tri ráno, môžete to vyriešiť (a vytiahnuť druhú poštovú rutinu neskôr v skripte).
# Zobraziť aktuálnu top:
echo "top teraz ukazuje:" >> $ tmpfile
echo "top teraz ukazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile
Ďalšie kontroly:
# Zobraziť aktuálne pripojenia:
echo "netstat teraz ukazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Skontrolujte miesto na disku
echo "miesto na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile
Potom napíšte dočasný obsah súboru do stálejšieho súboru denníka a výsledky odošlite príslušným stranám. Druhá zásielka je výsledkom porovnateľných výsledkov, ktoré pozostávajú jednoducho z úrovne "zhora":
# Odoslať výsledky do súboru denníka:
/ bin / mačka $ tmpfile >> $ logfile# A výsledky e-mailu sysadmin:
/ usr / bin / mutt -s "$ stroj má vysokú úroveň zaťaženia! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
A potom nejaká domácnosť a výstup:
# A potom odstráňte dočasný súbor:
rm $ tmpfile
rm $ topfile
fi#
exit 0
Dúfajme, že to pomôže niekomu vonku. Plne zostavený skript je:
#! / Bin / bash
#
# Skript, aby ste skontrolovali priemernú úroveň zaťaženia systému, aby ste sa pokúsili určiť, aké procesy sú
# vzal to príliš vysoko ...
#
# nastavené prostredie
dt = "dátum +% d% b% Y-% X"
# Zrejme, zmeňte nasledujúce adresáre na miesto, kde sa skutočne uchovávajú vaše súbory denníka
tmpfile = "/ TMP / checkSystemLoad.tmp"
logfile = "/ TMP / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# prvý mailstop je štandardný e-mail pre správy. Druhá je pre mobilný telefón (so zdieľanou správou)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
Stroj = "hostiteľa"
# Nasledujúce tri sú pre mytop použitie - používajte db užívateľa, ktorý má slušné práva
dbusr = "meno"
dBpW = "password"
db = "yourdatabasename"
# Nasledujúce je úroveň zaťaženia na kontrolu - 10 je naozaj vysoká, takže ho možno budete chcieť znížiť.
levelToCheck = 10
# Nastaviť premenné zo systému:
loadLevel = "cat / proc / loadavg | awk" tlač $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# ak je úroveň zaťaženia vyššia, než chcete, spustite proces skriptu. V opačnom prípade opustite 0
ak [$ loadLevel -gt $ levelToCheck]; potom
echo ""> $ tmpfile
echo "****************************************" >> $ tmpfile
echo "Dátum: $ dt" >> $ tmpfile
echo "Kontrola zaťaženia a procesov systému" >> $ tmpfile
echo "****************************************" >> $ tmpfile# Získajte ďalšie premenné zo systému:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Zobraziť aktuálnu úroveň zaťaženia:
echo "Úroveň zaťaženia je: $ loadLevel" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile# Zobraziť počet bežiacich procesov httpd (bez detí):
echo "Počet procesov httpd teraz: $ httpdProcesses" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobraziť zoznam procesov:
echo "Prebiehajúce procesy:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobraziť aktuálne informácie o MySQL:
echo "Výsledky z mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobraziť aktuálnu top:
echo "top teraz ukazuje:" >> $ tmpfile
echo "top teraz ukazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobraziť aktuálne pripojenia:
echo "netstat teraz ukazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Skontrolujte miesto na disku
echo "miesto na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Odoslať výsledky do súboru denníka:
/ bin / mačka $ tmpfile >> $ logfile# A výsledky e-mailu sysadmin:
/ usr / bin / mutt -s "$ stroj má vysokú úroveň zaťaženia! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# A potom odstráňte dočasný súbor:
rm $ tmpfile
rm $ topfile
fi#
exit 0