Jika Anda telah menjadi admin untuk waktu yang lama, Anda pasti menemukan situasi di mana lonjakan server dalam penggunaan CPU atau penggunaan memori dan / atau tingkat beban. Menjalankan 'top' tidak akan selalu memberi Anda jawaban. Jadi bagaimana Anda menemukan proses licik yang mengunyah sumber daya sistem Anda untuk dapat membunuh mereka?
Naskah berikut mungkin bisa membantu. Itu ditulis untuk server web, sehingga memiliki beberapa bagian yang secara khusus mencari proses httpd dan beberapa bagian yang berhubungan dengan MySQL. Tergantung pada penyebaran server Anda, cukup komentar / hapus bagian tersebut dan tambahkan yang lain. Itu harus digunakan untuk titik awal.
Prasyarat untuk versi skrip ini adalah beberapa freeware yang dirilis di bawah Lisensi Publik Umum GNU yang disebut mytop (tersedia di http://jeremy.zawodny.com/mysql/mytop/) yang merupakan alat yang luar biasa untuk memeriksa bagaimana kinerja MySQL. Sudah semakin tua, tetapi masih berfungsi dengan baik untuk tujuan kita di sini.
Selain itu, saya menggunakan mutt sebagai mailer - Anda mungkin ingin mengubah skrip untuk hanya menggunakan linux yang dibangun di 'mail' utilitas. Saya menjalankannya melalui cron setiap jam; sesuaikan sesuai keinginan Anda. Oh - dan skrip ini harus dijalankan sebagai root karena ia membaca dari beberapa area yang dilindungi dari server.
Jadi mari kita mulai, ya?
Pertama, atur variabel skrip Anda:
#! / bin / bash
#
# Script untuk memeriksa load system level rata-rata untuk mencoba menentukan
# proses apa yang mengambilnya terlalu tinggi ...
#
# 07Jul2010 tjones
#
# mengatur lingkungan
dt = "tanggal +% d% b% Y-% X"
# Tentunya, ubah direktori berikut ke tempat file log Anda benar-benar disimpan
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# mailstop pertama adalah email standar untuk laporan. Yang kedua adalah untuk ponsel (dengan laporan yang dikupas ke bawah)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
mesin = "nama host"
# Tiga berikut ini untuk penggunaan mytop - gunakan pengguna db yang memiliki hak yang layak
dbusr = "nama pengguna"
dbpw = "kata sandi"
db = "yourdatabasename"
# Berikut ini adalah tingkat beban untuk diperiksa - 10 sangat tinggi, jadi Anda mungkin ingin menurunkannya.
levelToCheck = 10
Selanjutnya, periksa tingkat beban Anda untuk melihat apakah skrip harus melanjutkan:
# Set variabel dari sistem:
loadLevel = "cat / proc / loadavg | awk" cetak $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)
# Jika tingkat beban lebih besar dari yang Anda inginkan, mulailah proses skrip. Jika tidak, keluar dari 0
jika [$ loadLevel -gt $ levelToCheck]; kemudian
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Tanggal: $ dt" >> $ tmpfile
echo "Periksa Beban Sistem & Proses" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Dan lanjutkan melalui pemeriksaan, tulis hasilnya ke file sementara. Tambahkan atau hapus item dari sini jika berlaku untuk situasi Anda:
# Dapatkan lebih banyak variabel dari sistem:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc-l"
# Tampilkan tingkat beban saat ini:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Tampilkan jumlah proses httpd yang sekarang berjalan (tidak termasuk anak-anak):
echo "Jumlah proses httpd sekarang: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tampilkan daftar proses:
echo "Proses sekarang berjalan:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tampilkan info MySQL saat ini:
echo "Hasil dari mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Perhatikan dengan perintah atas, kita menulis ke dua file temp. Salah satunya adalah untuk pesan yang jauh lebih kecil ke ponsel. Jika Anda tidak ingin urgensi lansiran ponsel pada pukul tiga pagi, Anda dapat mengambil ini (dan keluarkan rutinitas email kedua nanti di skrip).
# Tampilkan arus teratas:
echo "atas sekarang menunjukkan:" >> $ tmpfile
echo "top now shows:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Pemeriksaan lebih lanjut:
# Tampilkan koneksi saat ini:
echo "netstat sekarang menunjukkan:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
# Periksa ruang disk
echo "ruang disk:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Kemudian tuliskan konten file sementara ke file log yang lebih permanen dan kirim hasilnya ke pihak yang sesuai. Pengiriman kedua adalah hasil yang dikurangkan hanya terdiri dari standar dari 'atas':
# Kirim hasil ke file log:
/ bin / cat $ tmpfile >> $ logfile
# Dan hasil email ke sysadmin:
/ usr / bin / mutt -s "$ machine memiliki tingkat beban tinggi! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$ tmpfile / usr / bin / mutt -s "$ machine memiliki tingkat beban yang tinggi ! - $ Dt "$ mailstop1> $ logfile
Dan kemudian beberapa rumah tangga dan keluar:
# Dan kemudian hapus file temp:
rm $ tmpfile
rm $ topfile
fi
#
keluar 0
Semoga ini membantu seseorang di luar sana. Skrip yang dirakit sepenuhnya adalah:
#! / bin / bash
#
# Script untuk memeriksa level load sistem rata-rata untuk mencoba menentukan proses apa
# mengambilnya terlalu tinggi ...
#
# mengatur lingkungan
dt = "tanggal +% d% b% Y-% X"
# Tentunya, ubah direktori berikut ke tempat file log Anda benar-benar disimpan
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# mailstop pertama adalah email standar untuk laporan. Yang kedua adalah untuk ponsel (dengan laporan yang dikupas ke bawah)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
mesin = "nama host"
# Tiga berikut ini untuk penggunaan mytop - gunakan pengguna db yang memiliki hak yang layak
dbusr = "nama pengguna"
dbpw = "kata sandi"
db = "yourdatabasename"
# Berikut ini adalah tingkat beban untuk diperiksa - 10 sangat tinggi, jadi Anda mungkin ingin menurunkannya.
levelToCheck = 10
# Set variabel dari sistem:
loadLevel = "cat / proc / loadavg | awk" cetak $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)
# Jika tingkat beban lebih besar dari yang Anda inginkan, mulailah proses skrip. Jika tidak, keluar dari 0
jika [$ loadLevel -gt $ levelToCheck]; kemudian
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Tanggal: $ dt" >> $ tmpfile
echo "Periksa Beban Sistem & Proses" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Dapatkan lebih banyak variabel dari sistem:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc-l"# Tampilkan tingkat beban saat ini:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Tampilkan jumlah proses httpd yang sekarang berjalan (tidak termasuk anak-anak):
echo "Jumlah proses httpd sekarang: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tampilkan daftar proses:
echo "Proses sekarang berjalan:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tampilkan info MySQL saat ini:
echo "Hasil dari mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tampilkan arus teratas:
echo "atas sekarang menunjukkan:" >> $ tmpfile
echo "top now shows:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tampilkan koneksi saat ini:
echo "netstat sekarang menunjukkan:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Periksa ruang disk
echo "ruang disk:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Kirim hasil ke file log:
/ bin / cat $ tmpfile >> $ logfile# Dan hasil email ke sysadmin:
/ usr / bin / mutt -s "$ machine memiliki tingkat beban tinggi! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$ tmpfile / usr / bin / mutt -s "$ machine memiliki tingkat beban yang tinggi ! - $ Dt "$ mailstop1> $ logfile# Dan kemudian hapus file temp:
rm $ tmpfile
rm $ topfile
fi#
keluar 0