サーバーの操作とメンテナンスプロセス中に、システム内で異常が発生し、システム管理者に通知したときに迅速にアラームするように、CPUの負荷監視、ディスク使用量の監視、プロセス番号監視など:サーバーのさまざまなリソースを監視する必要があることがよくあります。この記事では、いくつかの一般的な監視要件とLinux Systemsのシェルスクリプトの書き込みを紹介します。
記事ディレクトリ:
1.Linuxはシェルを使用して、プロセスが存在するかどうかを確認します
2。Linuxはシェルを使用してプロセスCPU使用率を検出します
3. Linuxはシェルを使用してプロセスメモリの使用量を検出します
4. Linuxはシェルを使用してプロセスハンドルの使用を検出します
5.Linuxはシェルを使用して、TCPまたはUDPポートが聴いているかどうかを確認します
6.Linuxはシェルを使用して実行中のプロセスの数を表示します
7。Linuxはシェルを使用してシステムCPU負荷を検出します
8。Linuxはシェルを使用してシステムディスクスペースを検出します
9。概要
プロセスが存在するかどうかを確認してください
プロセスを監視するときは、通常、プロセスのIDを取得する必要があります。プロセスIDはプロセスの一意の識別子ですが、同じプロセス名を持つ複数のプロセスがサーバー上の異なるユーザーの下で実行される場合があります。以下の関数GetPidは、指定されたユーザーの下で指定されたプロセス名のプロセスIDを取得する機能を示しています(現在、このユーザーの下でこのプロセス名でプロセスを開始することのみを考慮しています)。ユーザー名とプロセス名の2つのパラメーターがあります。最初にPSを使用してプロセス情報を見つけ、GREPを介して必要なプロセスをフィルタリングし、最後にSEDとAWKを介してプロセスのID値を見つけます(この関数は、他の情報のフィルタリングなど、実際の条件に応じて変更できます)。
リスト1。プロセスの監視
コードコピーは次のとおりです。
function getPid #user #name
{
psuser = $ 1
psname = $ 2
pid = `ps -u $ psuser | grep $ psname | grep -v grep | grep -v vi | grep -v dbx/n
| grep -v tail | grep -v start | grep -v stop | sed -n 1p | awk '{print $ 1}' ``
echo $ pid
}
サンプルデモンストレーション:
1)ソースプログラム(たとえば、ユーザーのプロセスIDをルートとして見つけ、プロセス名はcftestAppです)
コードコピーは次のとおりです。
pid = `getpid root cftestapp`
echo $ pid
2)結果出力
コードコピーは次のとおりです。
11426
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力から、11426がルートユーザーの下のCftestAppプログラムのプロセスIDであることがわかります。
4)コマンドの紹介
1。PS:システム内のインスタントプロセス情報を表示します。パラメーター:-u <ユーザー識別コード>は、ユーザーに属するプログラムのステータスをリストし、ユーザー名を使用して指定することもできます。 -p <プロセス識別コード>プロセス識別コードを指定し、プロセスのステータスをリストします。 -o出力形式2を指定します。2。grep:文字列に一致するファイル内の現在の行を見つけるために使用されます。パラメーター:-v逆選択、つまり「検索文字列」コンテンツを表示しない行。 3。SED:標準入力からファイルまたはエクスポートされたファイルを編集し、一度に1行のコンテンツのみを処理できる非対話的テキストエディター。パラメーター:-n次の入力行を読み取り、次のコマンドを使用して、最初のコマンドの代わりに新しい行を処理します。 Pフラグ印刷ライン4。AWK:Linux/Unixの下でテキストとデータを処理するためのプログラミング言語。データは、標準の入力、1つ以上のファイル、または他のコマンドの出力からのものです。ユーザー定義機能や動的な正規表現などの高度な機能をサポートし、Linux/UNIXの下で強力なプログラミングツールです。コマンドラインで使用されますが、スクリプトとして使用されます。 Awkのテキストとデータの処理方法:ファイルを最初の行から最後の行まで、ファイルを段階的にスキャンし、特定のパターンを一致させる行を探し、それらの行で必要なことを行います。処理アクションが指定されていない場合、一致する行が標準出力(画面)に表示されます。モードが指定されていない場合、操作によって指定されたすべての行が処理されます。パラメーター:-f fsまたはfield -separator fs:入力ファイル区切り文字を指定し、FSは-f:などの文字列または正規表現です。
プロセスが開始されていない可能性があります。次の関数は、プロセスIDが存在するかどうかを確認することです。このプロセスが出力を実行しない場合:
コードコピーは次のとおりです。
プロセスは存在しません。
#プロセスが存在するかどうかを確認します
if ["-$ pid" == " - "]
それから
{
エコー「プロセスは存在しません。」
}
fi
プロセスCPU使用率を検出します
アプリケーションサービスを維持するとき、私たちはしばしば過剰なCPUのためにビジネスの閉塞に遭遇し、ビジネスの中断をもたらします。 CPUが高すぎる場合、それは過度のビジネス負荷またはデッドサイクルなどの異常なサイクルが原因である可能性があります。ビジネスプロセスのCPUはスクリプトを通じてタイムリーに監視され、CPUの使用率が異常である場合、メンテナンス担当者はタイムリーに通知できます。次の関数は、指定されたプロセスIDのプロセスCPU使用率を取得できます。プロセスIDとしてパラメーターがあります。最初にPSを使用してプロセス情報を見つけ、GREP -Vを介して%CPU行を除去し、最後にAWWを介してCPU使用率の整数部分を見つけます(システムに複数のCPUがある場合、CPU使用率は100%を超えます)。
リスト2。ビジネスプロセスCPUのリアルタイム監視
コードコピーは次のとおりです。
関数getCPU
{
cpuvalue = `ps -p $ 1 -o pcpu | grep -v cpu | awk '{print $ 1}' | awk -f。 '{$ 1}' `
echo $ cpuvalue
}
次の関数は、上記の関数GETCPUを介してこのプロセスのCPU利用を取得し、条件付きステートメントを使用して、CPUの使用率が制限を超えるかどうかを判断することです。 80%を超える場合(実際の状況に応じて調整できます)、アラームは出力され、それ以外の場合は通常の情報が出力されます。
リスト3。CPU使用率が制限を超えるかどうかを判断します
コードコピーは次のとおりです。
関数checkcpu
{
PID = $ 1
cpu = `getcpu $ pid`
[$ cpu -gt 80]の場合
それから
{
エコー「CPUの使用法は80%を超えています」
}
それ以外
{
エコー「CPUの使用法は正常です」
}
fi
}
サンプルデモンストレーション:
1)ソースプログラム(CftestAppのプロセスIDが上記で質問されていると仮定すると11426)
コードコピーは次のとおりです。
CHECKCPU 11426
2)結果出力
コードコピーは次のとおりです。
CPUの使用は75です
CPUの使用は正常です
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力からわかるように、CFTESTAPPプログラムの現在のCPU使用は75%であり、これは正常であり、80%を超えるアラーム制限はありません。
プロセスメモリ使用量を検出します
アプリケーションサービスを維持する場合、メモリが過剰なメモリ使用量のためにプロセスがクラッシュし、ビジネスの中断が発生することがよくあります(たとえば、32ビットプログラムが対処できる最大メモリスペースは4Gです。過度のメモリの使用は、メモリの漏れ、メッセージの蓄積などによる可能性があります。ビジネスプロセスのメモリの使用は、スクリプトを通じてタイムリーに監視でき、メモリの使用がタイムリーに(SMSを介して)異常である場合にタイムリーに送信できます。次の関数は、指定されたプロセスIDのプロセスメモリ使用法を取得できます。 PSを使用してプロセス情報を見つけ、GREP -Vを介してVSZラインをフィルターアウトし、1000を除算してメガバイトでメモリ使用を取得するプロセスIDとしてパラメーターがあります。
リスト4。ビジネスプロセスのメモリ使用の監視
コードコピーは次のとおりです。
関数getMem
{
memusage = `ps -o vsz -p $ 1 | grep -v vsz`
((memusage /= 1000))
echo $ memusage
}
次の関数は、上記の関数GetMemを使用してこのプロセスのメモリ使用量を取得し、条件付きステートメントを使用して、メモリの使用量が制限を超えるかどうかを判断することです。 1.6gを超えると(実際の状況に応じて調整できます)、アラームが出力され、それ以外の場合は通常の情報が出力されます。
リスト5。メモリの使用が制限を超えるかどうかを判断します
コードコピーは次のとおりです。
mem = `getmem $ pid`
[$ mem -gt 1600]の場合
それから
{
エコー「メモリの使用は1.6gより大きい」
}
それ以外
{
エコー「メモリの使用は正常です」
}
fi
サンプルデモンストレーション:
1)ソースプログラム(CftestAppのプロセスIDが上記で質問されていると仮定すると11426)
コードコピーは次のとおりです。
mem = `getMem 11426`
エコー「メモリの使用法は$ mem m」
[$ mem -gt 1600]の場合
それから
{
エコー「メモリの使用は1.6gより大きい」
}
それ以外
{
エコー「メモリの使用は正常です」
}
fi
2)結果出力
コードコピーは次のとおりです。
メモリの使用は248 mです
メモリの使用は正常です
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力から、CFTESTAPPプログラムの現在のメモリ使用量は248mであり、これは正常であり、1.6gを超えるアラーム制限がないことがわかります。
プロセスハンドルの使用法を検出します
アプリケーションサービスを維持する場合、ハンドルが過剰に使用されるため、ビジネスの中断はしばしば発生します。各プラットフォームは、使用が限られているプロセスハンドルを使用します。たとえば、Linuxプラットフォームでは、Ulimit Nコマンド(Open Files(-N)1024)を使用したり、/etc/security/limits.confのコンテンツを表示してプロセスハンドル制限を取得したりできます。ハンドルが高すぎる場合、ハンドルの漏れは過度の負荷、ハンドルの漏れなどが原因である可能性があります。ビジネスプロセスのハンドルの使用は、スクリプトを通じてタイムリーに監視され、アラームはタイムリーに送信できます(SMSなど)。次の関数は、指定されたプロセスIDのプロセスハンドル使用量を取得できます。プロセスIDとしてパラメーターがあります。最初にLSを使用してプロセスハンドル情報を出力し、次にWC -Lを介して出力ハンドルの数をカウントします。
コードコピーは次のとおりです。
関数getDes
{
des = `ls/proc/$ 1/fd | wc -l`
echo $ des
}
次の関数は、上記の関数GetDesを介してこのプロセスのハンドル使用量を取得し、条件付きステートメントを使用して、ハンドルの使用量が制限を超えるかどうかを判断することです。 900を超える場合(実際の状況に応じて調整できます)、アラームは出力され、それ以外の場合は通常の情報が出力されます。
コードコピーは次のとおりです。
des = `getdes $ pid`
[$ des -gt900]の場合
それから
{
エコー「DESの数は900を超えています」
}
それ以外
{
エコー「DESの数は正常です」
}
fi
サンプルデモンストレーション:
1)ソースプログラム(CftestAppのプロセスIDが上にあると仮定すると11426)
コードコピーは次のとおりです。
des = `getdes 11426`
エコー「desの数は$ des」
[$ des -gt900]の場合
それから
{
エコー「DESの数は900を超えています」
}
それ以外
{
エコー「DESの数は正常です」
}
fi
2)結果出力
コードコピーは次のとおりです。
DESの数は528です
DESの数は正常です
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力から、CftestAppプログラムの現在のハンドルは528であり、これは正常であり、900を超えるアラーム制限はありません。
4)コマンドの紹介
WC:統計指定されたファイルのバイト、単語、および行の数は、統計結果を出力に表示します。パラメーター:-l行数をカウントします。 -cバイト数をカウントします。 -Wカウントワードカウント。
TCPまたはUDPポートが聴いているかどうかを確認してください
ポート検出は、システムリソースの検出で多くの場合発生します。特にネットワーク通信では、ポートステータスの検出が非常に重要です。プロセス、CPU、メモリなどが正常状態にある場合がありますが、ポートは異常な状態であり、ビジネスは正常に実行されていません。次の関数は、指定されたポートがリスニングされているかどうかを判断できます。検出されるポートであるパラメーターがあります。最初にNetStatを使用してポート職業情報を出力し、次にGrep、AWK、WCを介してTCPポートの出力数をフィルターします。 2番目のステートメントは、UDPポートのモニターの数を出力することです。 TCPポートとUDPポートの両方が0の場合、0を返し、それ以外の場合は1を返します。
リスト6。ポート検出
コードコピーは次のとおりです。
機能リスニング
{
tcplisteningnum = `netstat -an | grep ":$ 1" | /n
awk '$ 1 == "tcp" && $ nf == "聞く" {印刷$ 0}' | wc -l`
udplisteningnum = `netstat -an | grep":$ 1 " /n
| awk '$ 1 == "udp" && $ nf == "0.0.0.0:*" {print $ 0}' | wc -l`
((listensnum = tcplisteningnum + udplisteningnum))
if [$ reastiningnum == 0]
それから
{
エコー "0"
}
それ以外
{
エコー "1"
}
fi
}
サンプルデモンストレーション:
1)ソースプログラム(たとえば、ポート8080のステータスが聴いているかどうかを照会)
コードコピーは次のとおりです。
islisten = `聴取8080`
[$ islisten -eq 1]の場合
それから
{
エコー「ポートは聞いている」
}
それ以外
{
エコー「ポートは聞いていない」
}
fi
2)結果出力
コードコピーは次のとおりです。
ポートは聞いています
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力から、このLinuxサーバーの8080ポートがリスニング状態にあることがわかります。
4)コマンドの紹介
NetStat:IP、TCP、UDP、およびICMPプロトコルに関連する統計データを表示するために使用され、通常、マシンの各ポートのネットワーク接続ステータスを確認するために使用されます。パラメーター:-Aすべての接続でソケットを表示します。 -nドメイン名サーバーを介してではなく、IPアドレスを直接使用します。
次の関数は、TCPポートまたはUDPポートが通常の状態にあるかどうかを検出することもできます。
コードコピーは次のとおりです。
TCP:netstat -an | egrep $ 1 | awk '$ 6 == "聞く" && $ 1 == "tcp" {print $ 0}'
udp:netstat -an | egrep $ 1 | awk '$ 1 == "udp" && $ 5 == "0.0.0.0:*" {print $ 0}'
コマンドの紹介
EGREP:ファイル内の指定された文字列を見つけます。 EGREPの実行効果は、grep -eのようなものです。使用される構文とパラメーターは、GREP命令を参照できます。 GREPとの違いは、文字列を解釈する方法です。 EGREPは、拡張された正規表現構文を使用して解釈されますが、GREPは基本的な正規表現構文を使用します。拡張された正規表現には、基本的な正規表現よりも完全な表現仕様があります。
実行中のプロセスの数を確認してください
サーバー上のプロセスの開始数を取得する必要がある場合があります。次の関数は、プロセス名がCftestAppであるなど、実行中のプロセスの数を検出することです。
コードコピーは次のとおりです。
runnum = `ps -ef | GREP -V VI | grep -v尾| grep "[ /] cftestApp" | grep -v grep | WC -L
システムCPU負荷を検出します
サーバーを維持する場合、システムCPU(使用率)の負荷が過剰になるため、ビジネスの中断が発生する場合があります。サーバーで複数のプロセスを実行することが可能かもしれません。単一のプロセスのCPUを表示するのは正常ですが、システム全体のCPU負荷は異常である可能性があります。システムCPUの負荷はスクリプトを通じてタイムリーに監視され、異常が発生した場合にアラームをタイムリーに送信できます。これにより、メンテナンス担当者がタイムリーに対処し、事故を防ぐことができます。次の関数は、システムのCPU使用量を検出できます。 VMSTATを使用して、システムCPUのアイドル値を5回使用し、平均値を取得し、100から差を取得して現在のCPUの実際の占有率を取得します。
コードコピーは次のとおりです。
関数getsyscpu
{
cpuidle = `vmstat 1 5 | sed -n '3、$ p' /n
| awk '{x = x + $ 15} end {print x/5}' | awk -f。 '{$ 1を印刷}'
cpunum = `echo" 100- $ cpuidle "| bc`
echo $ cpunum
}
サンプルデモンストレーション:
1)ソースプログラム
コードコピーは次のとおりです。
cpu = `getsyscpu`
エコー「システムCPUは$ CPUです」
[$ cpu -gt 90]の場合
それから
{
エコー「システムCPUの使用法は90%を超えています」
}
それ以外
{
エコー「システムCPUの使用法は正常です」
}
fi
2)結果出力
コードコピーは次のとおりです。
システムCPUは87です
システムCPUの使用は正常です
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力から、Linuxサーバーシステムの現在のCPU使用率は87%であり、これは正常であり、90%を超えるアラーム制限はないことがわかります。
4)コマンドの紹介
VMSTAT:オペレーティングシステムの仮想メモリ、プロセス、およびCPUアクティビティを監視できる仮想Meomory統計の略語。
パラメーター:-nとは、出力ヘッダー情報が周期的な周期出力中に1回のみ表示される場合を意味します。
システムディスクスペースを検出します
システムディスクスペースの検出は、システムリソース検出の重要な部分です。システムのメンテナンス中に、サーバーディスクスペースの使用を確認する必要があることがよくあります。一部の企業は、いつでもコールシート、ログ、または一時ファイルを書く必要があるため、ディスクスペースが使い果たされている場合、ビジネスの中断を引き起こす可能性もあります。次の関数は、現在のシステムディスクスペースのディレクトリのディスクスペース使用を検出できます。入力パラメーターは、検出する必要があるディレクトリ名で、DFを使用してシステムディスクスペース使用情報を出力し、GrepとAWWフィルタリングを介してディレクトリのディスクスペース使用率を取得します。
コードコピーは次のとおりです。
function getDiskspc
{
[$#-ne 1]の場合
それから
返品1
fi
folder = "$ 1 $"
diskspace = `df -k | grep $ folder | awk '{print $ 5}' | awk -f% '{print $ 1}'
echo $ diskspace
}
サンプルデモンストレーション:
1)ソースプログラム(検出ディレクトリは /boot)
コードコピーは次のとおりです。
folder = "/boot"
diskspace = `getdiskspc $ folder`
エコー「システム$フォルダーディスクスペースは$ diskspace%」
[$ diskspace -gt 90]の場合
それから
{
エコー「システムディスクの使用($フォルダー)は90%を超えています」
}
それ以外
{
エコー「システムディスクの使用($フォルダー)は正常です」
}
fi
2)結果出力
コードコピーは次のとおりです。
システム /ブートディスクスペースは14%です
システムディスクの使用(/boot)は正常です
[dyu@xilinuxbldsrv shell] $
3)結果分析
上記の出力からわかるように:現在、このLinuxサーバーシステムの /bootディレクトリのディスクスペースは14%使用されており、これは正常であり、90%以上の使用のアラーム制限はありません。
4)コマンドの紹介
DF:ファイルシステムのディスクスペース使用量を確認します。このコマンドは、ハードディスクが占有しているスペースの量や残りのスペースの量などの情報を取得するために使用できます。パラメーター:-kはkバイトに表示されます。
要約します
Linuxプラットフォームでは、シェルスクリプトの監視は、システム開発とプロセスメンテナンス担当者に非常に役立つ、サーバーとプロセスを監視するための非常にシンプルで便利で効果的な方法です。上記の情報を監視してアラームを送信するだけでなく、プロセスログやその他の情報を監視できます。この記事がすべての人に役立つことを願っています。