Diagnosticiranje težav s strežnikom Linux s preprostim skriptom
Če ste že dlje časa upravljali, ste zagotovo odkrili situacije, ko strežnik poveča porabo CPU-ja ali ravni izkoriščenosti pomnilnika in / ali ravni obremenitve. Izvajanje 'top' vam ne bo vedno dalo odgovora. Torej, kako najti tiste skrite procese, ki žvečijo vaše sistemske vire, da bi jih lahko ubili?
Naslednji skript bi lahko pomagal. Napisano je bilo za spletni strežnik, tako da ima nekatere njegove dele, ki so posebej iskali procese httpd in nekatere dele, ki se ukvarjajo z MySQL. Odvisno od uvajanja strežnika preprosto komentirajte / izbrišite te dele in dodajte druge. Uporabiti ga je treba kot izhodišče.
Predpogoji za to različico skripta so nekatere brezplačne programske opreme, izdane pod GNU General Public License, imenovano mytop (na voljo na http://jeremy.zawodny.com/mysql/mytop/), kar je odlično orodje za preverjanje, kako MySQL deluje. Postaja stara, vendar še vedno odlično deluje za naše namene.
Poleg tega uporabljam mutt kot poštni predal - morda boste želeli spremeniti skript, da preprosto uporabite linux vgrajen program za pošto. Vsako uro ga vodim preko cron-a; prilagodite, kot se vam zdi primerno. Oh - in ta skript mora biti zagnan kot root, ker se bere iz nekaterih zaščitenih področij strežnika.
Torej, začnimo?
Najprej nastavite skriptne spremenljivke:
#! / bin / bash
#
# Skripta za preverjanje povprečnih ravni obremenitev sistema, da poskusite ugotoviti
# kateri procesi so preveč visoki ...
#
# 07Jul2010 tjones
#
# nastavite okolje
dt = "datum +% d% b% Y-% X"
# Očitno spremenite naslednje imenike na mesta, kjer se dejansko hranijo vaše datoteke dnevnika
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# je prvi poštni naslov standardna e-pošta za poročila. Drugi je za mobilni telefon (z zmanjšanim poročilom)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "ime gostitelja"
# Naslednji trije so za mytop uporabo - uporabite db uporabnika, ki ima dostojne pravice
dbusr = "uporabniško ime"
dbpw = "geslo"
db = "vašdatabasename"
# Naslednja je stopnja obremenitve za preverjanje - 10 je res visoka, zato jo boste morda želeli znižati.
levelToCheck = 10
Nato preverite raven nalaganja, da vidite, ali naj se skript nadaljuje:
# Nastavi spremenljivke iz sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# če je stopnja obremenitve večja, kot želite, začnite postopek skripta. V nasprotnem primeru zapustite 0
if [$ loadLevel -gt $ levelToCheck]; potem
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Preveri obremenitev sistema in procesi" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Nadaljujte s preverjanji in rezultate zapišite v začasno datoteko. Dodajte ali izbrišite elemente od tukaj, kjer je to primerno za vašo situacijo:
# Pridobite več spremenljivk iz sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Prikaži trenutno stopnjo obremenitve:
echo "Nivo obremenitve je: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Prikaži število potekajočih postopkov httpd (brez otrok):
echo "Število procesov httpd: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Prikaži seznam postopkov:
echo "Postopki se zdaj izvajajo:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Prikaži trenutne podatke o MySQL:
echo "Rezultati iz mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile
Obvestilo z zgornjim ukazom pišemo na dve datoteki temp. Ena je za veliko manjše sporočilo na mobilni telefon. Če ne želite, da se opozorila mobilnega telefona nujno zahtevajo ob treh zjutraj, lahko to vzamete ven (in pozneje v skriptu odstranite drugi poštni postopek).
# Prikaži trenutni vrh:
echo "top zdaj prikazuje:" >> $ tmpfile
echo "top now prikazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile
Več pregledov:
# Prikaži trenutne povezave:
echo "netstat zdaj prikazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Preverite prostor na disku
echo "prostor na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile
Nato vsebino začasne datoteke zapišite v trajnejšo datoteko dnevnika in rezultate pošljete ustreznim strankam. Druga pošta je zmanjšan rezultat, ki je sestavljen zgolj iz standarda iz "top":
# Pošlji rezultate v datoteko dnevnika:
/ bin / cat $ tmpfile >> $ logfile# In e-poštni rezultati za sysadmin:
/ usr / bin / mutt -s "$ machine ima visoko stopnjo obremenitve! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
In potem nekaj gospodinjstva in izhoda:
# In nato odstranite začasno datoteko:
rm $ tmpfile
rm $ topfile
fi#
izhod 0
Upajmo, da to pomaga nekomu tam zunaj. Popolnoma sestavljen skript je:
#! / bin / bash
#
# Skript za preverjanje povprečnih ravni obremenitev sistema, da bi poskušali ugotoviti, kateri procesi so
# je preveč visoka ...
#
# nastavite okolje
dt = "datum +% d% b% Y-% X"
# Očitno spremenite naslednje imenike na mesta, kjer se dejansko hranijo vaše datoteke dnevnika
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# je prvi poštni naslov standardna e-pošta za poročila. Drugi je za mobilni telefon (z zmanjšanim poročilom)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "ime gostitelja"
# Naslednji trije so za mytop uporabo - uporabite db uporabnika, ki ima dostojne pravice
dbusr = "uporabniško ime"
dbpw = "geslo"
db = "vašdatabasename"
# Naslednja je stopnja obremenitve za preverjanje - 10 je res visoka, zato jo boste morda želeli znižati.
levelToCheck = 10
# Nastavi spremenljivke iz sistema:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# če je stopnja obremenitve večja, kot želite, začnite postopek skripta. V nasprotnem primeru zapustite 0
if [$ loadLevel -gt $ levelToCheck]; potem
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Datum: $ dt" >> $ tmpfile
echo "Preveri obremenitev sistema in procesi" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Pridobite več spremenljivk iz sistema:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Prikaži trenutno stopnjo obremenitve:
echo "Nivo obremenitve je: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Prikaži število potekajočih postopkov httpd (brez otrok):
echo "Število procesov httpd: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Prikaži seznam postopkov:
echo "Postopki se zdaj izvajajo:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Prikaži trenutne podatke o MySQL:
echo "Rezultati iz mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Prikaži trenutni vrh:
echo "top zdaj prikazuje:" >> $ tmpfile
echo "top now prikazuje:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Prikaži trenutne povezave:
echo "netstat zdaj prikazuje:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Preverite prostor na disku
echo "prostor na disku:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo >> $ tmpfile# Pošlji rezultate v datoteko dnevnika:
/ bin / cat $ tmpfile >> $ logfile# In e-poštni rezultati za sysadmin:
/ usr / bin / mutt -s "$ machine ima visoko stopnjo obremenitve! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# In nato odstranite začasno datoteko:
rm $ tmpfile
rm $ topfile
fi#
izhod 0