Диагностика на Linux Server Заредете Проблеми с обикновен скрипт
Ако сте били администратор за какъвто и да е период от време, със сигурност сте открили ситуации, в които сървърът увеличава използването на процесора или нивата на използване и / или зареждане на паметта. Изпълнението 'top' също не винаги ще ви даде отговор. Как да намерите тези подли процеси, които дъвчат системните ресурси, за да могат да ги убият?
Следният скрипт може да ви помогне. Той е написан за уеб сървър, така че има някои части от него, които специално търсят httpd процеси и някои части, които се занимават с MySQL. В зависимост от разгръщането на сървъра, просто коментирайте / изтрийте тези секции и добавете други. Трябва да се използва за начална точка.
Предпоставки за тази версия на скрипта са някои безплатни програми, публикувани под GNU General Public License, наречено mytop (достъпно на http://jeremy.zawodny.com/mysql/mytop/), което е фантастично средство за проверка как работи MySQL. Старее, но все още работи чудесно за нашите цели.
Освен това, аз използвам mutt като пощенска кутия - може да искате да промените скрипта, за да използвате просто вградената Linux програма. Пускам го през cron на всеки час; коригирайте, както смятате за подходящо. О - и този скрипт трябва да работи като root, тъй като се чете от някои защитени области на сървъра.
Така че нека да започнем?
Първо задайте променливите на скрипта си:
#! / Хамбар / Баш
#
# Скрипт за проверка на средните нива на зареждане на системата, за да се опита да определи
# какви процеси са прекомерно високи…
#
# 07Jul2010 tjones
#
# зададете среда
dt = "дата +% d% b% Y-% X"
Очевидно е, че променете следните директории до мястото, където се съхраняват вашите лог файлове
tmpfile = "/ TMP / checkSystemLoad.tmp"
лог = "/ TMP / checkSystemLoad.log"
msgLog = "/ VAR / дневник / съобщения"
mysqlLog = "/ Var / дневник / mysqld.log"
# първият mailstop е стандартен имейл за отчети. Вторият е за мобилен телефон (с намален отчет)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
машина = "хост"
# Следващите три са за mytop употреба - използвайте db потребител, който има достойни права
dbusr = "потребителско име"
dbpw = "парола"
db = "yourdatabasename"
# Следното е нивото на зареждане, за да проверите - 10 е наистина високо, така че може да искате да го намалите.
levelToCheck = 10
След това проверете нивото на зареждане, за да видите дали скриптът трябва да продължи:
# Задаване на променливи от системата:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# ако нивото на натоварване е по-голямо от желаното, стартирайте процеса на скрипта. В противен случай излезте от 0
if [$ loadLevel -gt $ levelToCheck]; тогава
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Дата: $ dt" >> $ tmpfile
echo "Проверка на зареждането и процесите в системата" >> $ tmpfile
echo "**************************************" >> $ tmpfile
И продължете с проверките, записвайки резултатите във временния файл. Добавете или изтрийте елементи оттук, където е приложимо за вашата ситуация:
# Получете повече променливи от системата:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Показване на текущото ниво на зареждане:
echo "Ниво на натоварване: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Показване на броя текущи процеси в httpd (без деца):
echo "Брой на httpd процеси сега: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Покажи списъка с процеси:
echo "Процеси, които се изпълняват:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Покажи текущата информация за MySQL:
echo "Резултати от mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile
Забележете с командата top, пишем до два временни файла. Едната е за много по-малкото съобщение към мобилния телефон. Ако не искате спешно да сигнализирате за мобилен телефон в три сутринта, можете да го извадите (и да извадите втората рутинна поща по-късно в скрипта).
# Покажи текущия връх:
echo "top now показва:" >> $ tmpfile
echo "top now показва:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile
Още проверки:
# Покажи текущите връзки:
echo "netstat вече показва:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Проверете дисковото пространство
echo "дисково пространство:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile
След това напишете съдържанието на временния файл в по-постоянен лог файл и изпратете резултатите на съответните страни. Вторият мейлинг е съкратените резултати, които се състоят просто от стандарта от 'top':
# Изпращане на резултати в регистрационния файл:
/ bin / cat $ tmpfile >> $ logfile# И имейл резултати до sysadmin:
/ usr / bin / mutt -s "$ machine има високо ниво на натоварване! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ лог
И след това някои домакинства и излизане:
# И след това премахнете временния файл:
rm $ tmpfile
rm $ topfile
Fi#
exit 0
Надяваме се това да помогне на някой там. Напълно сглобеният скрипт е:
#! / Хамбар / Баш
#
# Скрипт за проверка на средните нива на зареждане на системата, за да се опита да определи какви процеси са
# го вземе прекалено високо ...
#
# зададете среда
dt = "дата +% d% b% Y-% X"
Очевидно е, че променете следните директории до мястото, където се съхраняват вашите лог файлове
tmpfile = "/ TMP / checkSystemLoad.tmp"
лог = "/ TMP / checkSystemLoad.log"
msgLog = "/ VAR / дневник / съобщения"
mysqlLog = "/ Var / дневник / mysqld.log"
# първият mailstop е стандартен имейл за отчети. Вторият е за мобилен телефон (с намален отчет)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
машина = "хост"
# Следващите три са за mytop употреба - използвайте db потребител, който има достойни права
dbusr = "потребителско име"
dbpw = "парола"
db = "yourdatabasename"
# Следното е нивото на зареждане, за да проверите - 10 е наистина високо, така че може да искате да го намалите.
levelToCheck = 10
# Задаване на променливи от системата:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# ако нивото на натоварване е по-голямо от желаното, стартирайте процеса на скрипта. В противен случай излезте от 0
if [$ loadLevel -gt $ levelToCheck]; тогава
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Дата: $ dt" >> $ tmpfile
echo "Проверка на зареждането и процесите в системата" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Получете повече променливи от системата:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Показване на текущото ниво на зареждане:
echo "Ниво на натоварване: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Показване на броя текущи процеси в httpd (без деца):
echo "Брой на httpd процеси сега: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Покажи списъка с процеси:
echo "Процеси, които се изпълняват:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Покажи текущата информация за MySQL:
echo "Резултати от mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Покажи текущия връх:
echo "top now показва:" >> $ tmpfile
echo "top now показва:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Покажи текущите връзки:
echo "netstat вече показва:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Проверете дисковото пространство
echo "дисково пространство:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" $ $ tmpfile# Изпращане на резултати в регистрационния файл:
/ bin / cat $ tmpfile >> $ logfile# И имейл резултати до sysadmin:
/ usr / bin / mutt -s "$ machine има високо ниво на натоварване! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ лог# И след това премахнете временния файл:
rm $ tmpfile
rm $ topfile
Fi#
exit 0