Diagnostikujte problémy s načítáním serveru Linux pomocí jednoduchého skriptu
Pokud jste administrátor po nějakou dobu, určitě jste zjistili situace, kdy server narůstá v používání CPU nebo při využití paměti a / nebo zatížení. Spuštění "vrcholu" vám vždy neposkytuje odpověď. Takže, jak zjistíte ty tajuplné procesy, které žvýkají vaše systémové prostředky, aby je mohly zabít?
Následující skript může pomoci. Byl napsán pro webový server, takže některé jeho části konkrétně hledají procesy httpd a některé části, které se zabývají MySQL. V závislosti na nasazení serveru stačí komentovat / smazat tyto oddíly a přidat další. Měla by být použita jako výchozí bod.
Předpoklady pro tuto verzi skriptu jsou některé freeware vydané pod GNU General Public License s názvem mytop (k dispozici na http://jeremy.zawodny.com/mysql/mytop/), což je fantastický nástroj pro kontrolu fungování MySQL. Stárne, ale stále funguje skvěle pro naše účely.
Navíc používám mutt jako mailer - můžete zkusit změnit skript jednoduše pomocí linuxu postaveného v utilitě 'mail'. Spouštím je přes cron každou hodinu; upravte podle svého uvážení. Oh - a tento skript musí běžet jako root, protože čte z některých chráněných oblastí serveru.
Takže začneme, budeme?
Nejprve nastavte proměnné skriptu:
#! / bin / bash
#
# Skript pro kontrolu zatížení systému průměrné úrovně se snaží určit
# jaké procesy ji přebírají příliš vysoko ...
#
# 07Jul2010 tjones
#
# nastavení prostředí
dt = "datum +% d% b% Y-% X"
# Zjistěte, změňte následující adresáře tam, kde jsou skutečně uloženy soubory protokolu
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / zprávy"
mysqlLog = "/ var / log / mysqld.log"
# první poštovní schránka je standardní e-mail pro zprávy. Druhá je pro mobilní telefon (s rozbalenou zprávou)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Následující tři jsou pro mytop použití - použijte db uživatele, který má slušné práva
dbusr = "uživatelské jméno"
dbpw = "heslo"
db = "yourdatabasename"
# Níže je úroveň zatížení, kterou chcete zkontrolovat - 10 je skutečně vysoká, takže jej můžete snížit.
levelToCheck = 10
Poté zkontrolujte úroveň zatížení a zkontrolujte, zda má skript pokračovat:
# Nastavte proměnné ze systému:
loadLevel = "cat / proc / loadavg | awk" tisk $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# Pokud je úroveň načítání větší, než chcete, spusťte proces skriptu. V opačném případě ukončíte 0
pokud [$ loadLevel -gt $ levelToCheck]; pak
echo ""> $ tmpfile
echo "***************************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Zkontrolovat zatížení a procesy systému" >> $ tmpfile
echo "***************************************" >> $ tmpfile
A pokračujte v kontrolách a zapisujte výsledky do dočasného souboru. Přidejte nebo odstraňte položky tam, kde je to vhodné pro vaši situaci:
# Získejte více proměnných ze systému:
httpdProcesses = "ps -def | grep | httpd | grep -v grep | wc -l"# Zobrazit aktuální úroveň zatížení:
echo "Úroveň zatížení je: $ loadLevel" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile# Zobrazit počet probíhajících procesů httpd (bez dětí):
echo "Počet procesů httpd nyní: $ httpdProcesses" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobrazit seznam procesů:
echo "Procesy běží:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobrazit aktuální informace o MySQL:
echo "Výsledky z mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile
Všimněte si, že pomocí příkazu top zapisujeme dva soubory temp. Jeden je pro mnohem menší zprávu na mobilní telefon. Pokud si nepřejete naléhavost upozornění na mobilní telefon ve tři ráno, můžete si to vzít (a vyřadit druhý poštovní rutinu později ve scénáři).
# Zobrazit aktuální top:
echo "top nyní ukazuje:" >> $ tmpfile
echo "nahoře ukazuje:" >> $ topfile
/ usr / bin / nahoru -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile
Další kontroly:
# Zobrazit aktuální připojení:
echo "netstat nyní ukazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zkontrolujte místo na disku
echo "místo na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile
Poté napište dočasný soubor do trvalějšího souboru protokolu a výsledky zašlete e-mailem příslušným stranám. Druhá zásilka je výsledkem srovnatelných výsledků, které se skládají jednoduše z "vrcholu":
# Odeslat výsledky do souboru protokolu:
/ bin / mačka $ tmpfile >> $ logfile# A výsledky e-mailu na sysadmin:
/ usr / bin / mutt -s "$ stroj má vysokou úroveň zatížení! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
A pak nějaké úklid a výstup:
# A potom odeberte soubor temp:
rm $ tmpfile
rm $ topfile
fi#
výstup 0
Doufejme, že to někomu pomůže. Plně sestavený skript je:
#! / bin / bash
#
# Script pro kontrolu úrovně zatížení systému, aby se zjistila, jaké procesy jsou
# to přebírá příliš vysoko ...
#
# nastavení prostředí
dt = "datum +% d% b% Y-% X"
# Zjistěte, změňte následující adresáře tam, kde jsou skutečně uloženy soubory protokolu
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / zprávy"
mysqlLog = "/ var / log / mysqld.log"
# první poštovní schránka je standardní e-mail pro zprávy. Druhá je pro mobilní telefon (s rozbalenou zprávou)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Následující tři jsou pro mytop použití - použijte db uživatele, který má slušné práva
dbusr = "uživatelské jméno"
dbpw = "heslo"
db = "yourdatabasename"
# Níže je úroveň zatížení, kterou chcete zkontrolovat - 10 je skutečně vysoká, takže jej můžete snížit.
levelToCheck = 10
# Nastavte proměnné ze systému:
loadLevel = "cat / proc / loadavg | awk" tisk $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# Pokud je úroveň načítání větší, než chcete, spusťte proces skriptu. V opačném případě ukončíte 0
pokud [$ loadLevel -gt $ levelToCheck]; pak
echo ""> $ tmpfile
echo "***************************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Zkontrolovat zatížení a procesy systému" >> $ tmpfile
echo "***************************************" >> $ tmpfile# Získejte více proměnných ze systému:
httpdProcesses = "ps -def | grep | httpd | grep -v grep | wc -l"# Zobrazit aktuální úroveň zatížení:
echo "Úroveň zatížení je: $ loadLevel" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile# Zobrazit počet probíhajících procesů httpd (bez dětí):
echo "Počet procesů httpd nyní: $ httpdProcesses" >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobrazit seznam procesů:
echo "Procesy běží:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobrazit aktuální informace o MySQL:
echo "Výsledky z mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobrazit aktuální top:
echo "top nyní ukazuje:" >> $ tmpfile
echo "nahoře ukazuje:" >> $ topfile
/ usr / bin / nahoru -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zobrazit aktuální připojení:
echo "netstat nyní ukazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Zkontrolujte místo na disku
echo "místo na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************* * ">> $ tmpfile
echo "" >> $ tmpfile# Odeslat výsledky do souboru protokolu:
/ bin / mačka $ tmpfile >> $ logfile# A výsledky e-mailu na sysadmin:
/ usr / bin / mutt -s "$ stroj má vysokou úroveň zatížení! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# A potom odeberte soubor temp:
rm $ tmpfile
rm $ topfile
fi#
výstup 0