単純なスクリプトでLinuxサーバのロード問題を診断する
管理者であれば、サーバーのCPU使用率やメモリ使用率、負荷レベルが急増している状況が確実にわかります。 'top'を実行しても、必ずしも答えが得られるとは限りません。それで、どのようにあなたはそれらを殺すことができるようにあなたのシステムリソースを噛んでいるそれらの卑劣なプロセスを見つけますか??
次のスクリプトが役に立つかもしれません。 Webサーバー用に書かれているので、httpdプロセスを特に探している部分とMySQLを扱う部分もあります。サーバーの配置に応じて、それらのセクションをコメント/削除して他のセクションを追加するだけです。出発点として使用する必要があります.
このバージョンのスクリプトの前提条件は、MySQLのパフォーマンスをチェックするための素晴らしいツールである、mytopと呼ばれるGNU General Public License(http://jeremy.zawodny.com/mysql/mytop/から入手可能)の下でリリースされたフリーウェアです。それは古くなっていますが、それでもここで私たちの目的のために素晴らしい作品.
さらに、私はメーラーとしてmuttを使用しています - スクリプトを変更して、単に 'mail'ユーティリティに組み込まれているlinuxを使用することをお勧めします。私は毎時cron経由で実行しています。あなたが合うように調整してください。ああ - そしてこのスクリプトはサーバーの保護された領域から読み込まれるのでrootとして実行する必要があります。.
それでは始めましょう。?
まず、スクリプト変数を設定します。
#!/ bin / bash
#
#システム負荷の平均レベルを調べて決定しようとするスクリプト
#どのプロセスがそれを過度に高くしているのか…
#
#07Jul2010タイヨン
#
#環境を設定する
dt = "日付+%d%b%Y - %X"
#明らかに、以下のディレクトリをあなたのログファイルが実際に保存される場所に変更してください。
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
#最初のメールストップはレポート用の標準電子メールです。 2つ目は携帯電話用です(レポートの要約)。
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "ホスト名"
#次の3つはmytop用です - まともな権限を持つdbユーザーを使用してください
dbusr = "username"
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 "Load Level Is:$ loadLevel" >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile#現在実行中のhttpdプロセスの数を表示します(子は含まない)。
echo "現在のhttpdプロセス数:$ httpdProcesses" >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#プロセスリストを表示:
echo "Processes now running:" >> $ tmpfile
ps f -ef >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#現在のMySQL情報を表示します。
echo "mytopの結果:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
topコマンドに注目してください、我々は2つの一時ファイルに書いています。 1つは携帯電話へのはるかに小さいメッセージ用です。午前3時に携帯電話の警告が緊急に表示されないようにするには、これを削除します(スクリプトの後半の2番目のメール送信ルーチンを削除します)。.
#現在のトップを表示:
echo "top now shows:" >> $ tmpfile
echo "top now shows:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
より多くのチェック:
#現在の接続を表示:
echo "netstat now shows:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#ディスク容量を確認する
echo "disk space:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
次に、一時ファイルの内容をより永続的なログファイルに書き込み、結果を適切な関係者に電子メールで送信します。 2番目のメーリングリストは、 '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 >$ logfile
そして、いくつかのハウスキーピングをして終了します。
#そして、一時ファイルを削除します。
rm $ tmpfile
rm $ topfile
fi#
0番出口
うまくいけば、これはそこに誰かに役立ちます。完全に組み立てられたスクリプトは以下のとおりです。
#!/ bin / bash
#
#システム負荷平均レベルをチェックしてどのプロセスが何であるかを判断するためのスクリプト
#過度に高くすると…
#
#環境を設定する
dt = "日付+%d%b%Y - %X"
#明らかに、以下のディレクトリをあなたのログファイルが実際に保存される場所に変更してください。
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
#最初のメールストップはレポート用の標準電子メールです。 2つ目は携帯電話用です(レポートの要約)。
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "ホスト名"
#次の3つはmytop用です - まともな権限を持つdbユーザーを使用してください
dbusr = "username"
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 "Load Level Is:$ loadLevel" >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile#現在実行中のhttpdプロセスの数を表示します(子は含まない)。
echo "現在のhttpdプロセス数:$ httpdProcesses" >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#プロセスリストを表示:
echo "Processes now running:" >> $ tmpfile
ps f -ef >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#現在のMySQL情報を表示します。
echo "mytopの結果:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#現在のトップを表示:
echo "top now shows:" >> $ tmpfile
echo "top now shows:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#現在の接続を表示:
echo "netstat now shows:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
エコー "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile#ディスク容量を確認する
echo "disk space:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
エコー "************************************************ * ">> $ 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 >$ logfile#そして、一時ファイルを削除します。
rm $ tmpfile
rm $ topfile
fi#
0番出口