Dijagnosticiranje Linux poslužitelja Učitavanje problema s jednostavnim skriptom
Ako ste bili admin u bilo kojem vremenskom razdoblju, sigurno ste otkrili situacije u kojima poslužitelj naglo povećava korištenje CPU-a ili iskorištenje memorije i / ili razine učitavanja. Trčanje 'top' ne daje vam uvijek odgovor. Pa kako ćete pronaći one tajne procese koji žvaču vaše sistemske resurse da bi ih mogli ubiti?
Sljedeća skripta može vam pomoći. Napisano je za web poslužitelj, tako da ima i neke dijelove koji su posebno u potrazi za httpd procesima i nekim dijelovima koji se bave MySQL-om. Ovisno o implementaciji poslužitelja, jednostavno komentirajte / izbrišite te odjeljke i dodajte druge. Trebao bi se koristiti za početnu točku.
Preduvjeti za ovu verziju skripte su neki besplatni programi objavljeni pod GNU Općom javnom licencom pod nazivom mytop (dostupno na http://jeremy.zawodny.com/mysql/mytop/), što je fantastičan alat za provjeru kako MySQL izvodi. Postaje stara, ali još uvijek dobro radi za naše potrebe.
Osim toga, ja koristiti mutt kao mailer - vi svibanj želite promijeniti skriptu jednostavno koristiti linux izgrađen u 'mail' korisnost. Pokrećem ga preko crona svaki sat; prilagodite kako vam odgovara. Oh - i ova skripta se mora pokrenuti kao root jer čita iz nekih zaštićenih područja poslužitelja.
Počnimo, hoćemo li?
Prvo postavite varijable skripte:
#! / Bin / bash
#
# Skripta za provjeru prosječnih razina opterećenja sustava kako bi se pokušalo odrediti
# koji su procesi pretjerano visoki ...
#
# 07Jul2010 tjones
#
# postavi okruženje
dt = "datum +% d% b% Y-% X"
# Očigledno, promijenite sljedeće direktorije na mjesta na kojima se zapravo nalaze log datoteke
tmpfile = "/ TMP / checkSystemLoad.tmp"
logfile = "/ TMP / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# prvi mailstop je standardna e-pošta za izvješća. Drugi je za mobitel (s smanjenim izvješćem)
poštanskog pretinca = "[email protected]"
mailstop1 = "[email protected]"
Stroj = „ime računala”
# Sljedeća tri su za mytop uporabu - koristite db korisnika koji ima pristojna prava
dbusr = "ime"
dbpw = "lozinka"
db = "yourdatabasename"
# Slijedeća je razina učitavanja za provjeru - 10 je stvarno visoka, tako da je možete smanjiti.
levelToCheck = 10
Zatim provjerite razinu opterećenja da biste vidjeli nastavlja li se skripta:
# Postavi varijable iz sustava:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# ako je razina učitavanja veća nego što želite, pokrenite proces skripte. Inače, izađite iz 0
if [$ loadLevel -gt $ levelToCheck]; zatim
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Provjerite učitavanje i procesiranje sustava" >> $ tmpfile
echo "**************************************" >> $ tmpfile
I nastavite provjere, zapisujući rezultate u privremenu datoteku. Dodajte ili izbrišite stavke odavde gdje je primjenjivo za vašu situaciju:
# Dobijte više varijabli iz sustava:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Prikaži trenutnu razinu opterećenja:
echo "Nivo opterećenja je: $ loadLevel" >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile# Prikaži broj HTTPd procesa koji se trenutno izvode (ne uključujući djecu):
echo "Broj httpd procesa sada: $ httpdProcesses" >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Prikaži popis postupaka:
echo "Procesi su sada pokrenuti:" >> $ tmpfile
ps f-ff >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Prikaži trenutne MySQL informacije:
echo "Rezultati s mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile
Primijetite s naredbom vrh, pišemo na dvije privremene datoteke. Jedan je za mnogo manju poruku na mobitel. Ako ne želite hitnost upozorenja na mobilni telefon u tri ujutro, možete to izvesti (i izuzeti drugu poštansku rutinu kasnije u skripti).
# Prikaži trenutni vrh:
echo "top now prikazuje:" >> $ tmpfile
echo "top now prikazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile
Više provjera:
# Prikaži trenutne veze:
echo "netstat sada pokazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Provjerite prostor na disku
echo "prostor na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile
Zatim zapišite privremeni sadržaj datoteke u trajniju datoteku dnevnika i pošaljite rezultate odgovarajućim stranama. Drugi mailing je smanjen rezultat koji se sastoji samo od standarda iz 'top':
# Pošalji rezultate u datoteku zapisnika:
/ bin / cat $ tmpfile >> $ logfile# I pošaljite rezultate na sysadmin:
/ usr / bin / mutt -s "$ machine ima visoku razinu opterećenja! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
A onda neka kućna služba i izlaz:
# I zatim uklonite privremenu datoteku:
rm $ tmpfile
rm $ topfile
fi#
izlaz 0
Nadam se da ovo pomaže nekome vani. Potpuno sklopljena skripta je:
#! / Bin / bash
#
# Skripta za provjeru prosječnih razina opterećenja sustava kako bi se utvrdilo koji su procesi
# to je pretjerano visoko
#
# postavi okruženje
dt = "datum +% d% b% Y-% X"
# Očigledno, promijenite sljedeće direktorije na mjesta na kojima se zapravo nalaze log datoteke
tmpfile = "/ TMP / checkSystemLoad.tmp"
logfile = "/ TMP / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# prvi mailstop je standardna e-pošta za izvješća. Drugi je za mobitel (s smanjenim izvješćem)
poštanskog pretinca = "[email protected]"
mailstop1 = "[email protected]"
Stroj = „ime računala”
# Sljedeća tri su za mytop uporabu - koristite db korisnika koji ima pristojna prava
dbusr = "ime"
dbpw = "lozinka"
db = "yourdatabasename"
# Slijedeća je razina učitavanja za provjeru - 10 je stvarno visoka, tako da je možete smanjiti.
levelToCheck = 10
# Postavi varijable iz sustava:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# ako je razina učitavanja veća nego što želite, pokrenite proces skripte. Inače, izađite iz 0
if [$ loadLevel -gt $ levelToCheck]; zatim
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Provjerite učitavanje i procesiranje sustava" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Dobijte više varijabli iz sustava:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Prikaži trenutnu razinu opterećenja:
echo "Nivo opterećenja je: $ loadLevel" >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile# Prikaži broj HTTPd procesa koji se trenutno izvode (ne uključujući djecu):
echo "Broj httpd procesa sada: $ httpdProcesses" >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Prikaži popis postupaka:
echo "Procesi su sada pokrenuti:" >> $ tmpfile
ps f-ff >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Prikaži trenutne MySQL informacije:
echo "Rezultati s mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Prikaži trenutni vrh:
echo "top now prikazuje:" >> $ tmpfile
echo "top now prikazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Prikaži trenutne veze:
echo "netstat sada pokazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Provjerite prostor na disku
echo "prostor na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
jeka "************************************************ * ">> $ tmpfile
echo "" $ tmpfile# Pošalji rezultate u datoteku zapisnika:
/ bin / cat $ tmpfile >> $ logfile# I pošaljite rezultate na sysadmin:
/ usr / bin / mutt -s "$ machine ima visoku razinu opterećenja! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# I zatim uklonite privremenu datoteku:
rm $ tmpfile
rm $ topfile
fi#
izlaz 0