サーバーの運用と保守のプロセスでは、CPU 負荷の監視、ディスク使用量の監視、プロセス数の監視など、サーバーのさまざまなリソースを監視して、問題が発生したときに即座にアラームを発して通知する必要があることがよくあります。システム管理者に異常が発生しました。この記事では、Linux システムでのいくつかの一般的な監視要件とシェル スクリプトの作成について紹介します。
記事ディレクトリ:
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. プロセスを監視する
サンプルデモ:
1) ソースプログラム (たとえば、ユーザーが root、プロセス名が CFTestApp であるプロセス ID を検索します)
3) 結果分析
上記の出力からわかるように、11426 は root ユーザーの下の CFTestApp プログラムのプロセス ID です。
4) コマンドの紹介
1. ps: システム内のインスタントプロセス情報を表示します。 パラメータ: -u このユーザーに属するプログラムのステータスを一覧表示します。これはユーザー名を使用して指定することもできます。 -p プロセスの CPU 使用率を検出 アプリケーション サービスを保守していると、CPU の負荷が高くなりすぎて、ビジネスの輻輳やビジネスの中断が発生する状況がよく発生します。過剰な CPU は、ビジネスの過負荷や無限ループなどの異常な状況が原因である可能性があります。ビジネス プロセスの CPU はスクリプトを通じて常に監視されており、CPU 使用率が異常な場合には保守担当者に通知されるため、保守担当者の分析、特定が容易になります。業務の中断などを適時回避する。次の関数は、指定されたプロセス ID のプロセス CPU 使用率を取得します。これにはプロセス ID のパラメーターがあり、まず ps を使用してプロセス情報を検索し、同時に grep -v で %CPU 行を除外し、最後に awk を使用して CPU 使用率の整数部分を検索します (複数ある場合)。システム内の CPU の場合、CPU 使用率が 100% を超える場合があります)。 リスト 2. ビジネス プロセス CPU のリアルタイム監視 リスト 3. CPU 使用率が制限を超えているかどうかを判断します サンプルデモ: 1) ソース プログラム (CFTestApp のプロセス ID が 11426 として上記でクエリされたと仮定します) 上記の出力からわかるように、CFTestApp プログラムの現在の CPU 使用率は 75% であり、これは正常であり、アラーム制限の 80% を超えません。 プロセスのメモリ使用量を検出します アプリケーション サービスを保守するとき、過剰なメモリ使用量によりプロセスがクラッシュし、ビジネスの中断を引き起こす状況によく遭遇します (たとえば、32 ビット プログラムの最大アドレス指定可能なメモリ空間は 4G です。これを超えると、メモリがアプリケーションは失敗し、物理メモリも制限されます)。過剰なメモリ使用量は、メモリ リークやメッセージの蓄積などが原因である可能性があります。ビジネス プロセスのメモリ使用量は、スクリプトを通じて常に監視されており、メモリ使用量が異常な場合には、アラームが(SMS などを通じて)送信されます。メンテナンス担当者がタイムリーに対応できます。次の関数は、指定されたプロセス ID のプロセス メモリ使用量を取得します。これにはプロセス ID のパラメーターがあり、まず ps を使用してプロセス情報を検索し、同時に grep -v で VSZ 行を除外し、次に 1000 で割ってメモリ使用量をメガバイト単位で取得します。 リスト 4. ビジネス プロセスのメモリ使用量を監視する リスト 5. メモリ使用量が制限を超えているかどうかを判断する
プロセス ハンドルの使用状況を検出
サンプルデモ: 1) ソースプログラム (上記クエリで見つかった CFTestApp のプロセス ID が 11426 であると仮定します) 2) 結果出力 上記の出力からわかるように、CFTestApp プログラムの現在のハンドル使用量は 528 で、これは正常であり、アラーム制限の 900 を超えません。 4) コマンドの紹介 wc: 指定されたファイルのバイト数、ワード数、行数をカウントし、統計結果を表示・出力します。 パラメータ: -l は行数をカウントします。 -c はバイトをカウントします。 -w 単語数をカウントします。 TCP または UDP ポートがリッスンしているかどうかを確認します ポートの検出は、システム リソースの検出でよく発生します。特にネットワーク通信の状況では、ポートのステータスの検出が非常に重要になることがよくあります。プロセスやCPU、メモリなどは正常であっても、ポートが異常な状態で業務が正常に動作していない場合があります。次の関数は、指定されたポートがリッスンしているかどうかを判断できます。このステートメントには、検出されるポートのパラメーターがあり、最初に netstat を使用してポート占有情報を出力し、次に grep、awk、および wc を使用してリスニングしている TCP ポートの数を除外します。2 番目のステートメントは、モニタリングしている UDP ポートの数を出力します。 . TCP および UDP ポートのリスニングがすべて 0 の場合は 0 を返し、それ以外の場合は 1 を返します。 リスト 6. ポート検出
上記の出力からわかるように、この Linux サーバーのポート 8080 はリスニング状態です。 4) コマンドの紹介 netstat: IP、TCP、UDP、ICMP プロトコルに関連する統計データを表示するために使用されます。通常、マシンの各ポートのネットワーク接続を確認するために使用されます。 パラメータ: -a は、接続内のすべてのソケットを表示します。 -n ドメインネームサーバーを経由せずに、IP アドレスを直接使用します。 egrep: ファイル内で指定された文字列を検索します。 egrep の実行効果は grep -E と似ています。使用される構文とパラメーターは grep コマンドを参照できます。grep との違いは、文字列の解釈に拡張正規表現構文を使用するのに対し、grep は基本的な正規表現を使用します。構文、拡張正規表現には、基本正規表現よりも完全な式仕様があります。 特定のプロセス名の実行プロセス数を表示 サーバー上で開始されたプロセスの数を取得する必要がある場合があります。たとえば、プロセス名は CFTestApp です。
3) 結果分析 上記の出力からわかるように、Linux サーバー システムの現在の CPU 使用率は 87% であり、これは正常であり、アラーム制限の 90% を超えません。 4) コマンドの紹介 vmstat: Virtual Meomory Statistics (仮想メモリ統計) の略称。オペレーティング システムの仮想メモリ、プロセス、CPU アクティビティを監視できます。 システムのディスク容量を確認します システムのディスク領域の検出は、システム リソースの検出の重要な部分であり、多くの場合、サーバーのディスク領域の使用状況を確認する必要があります。ビジネスによっては、通話メモ、ログ、または一時ファイルを時々書き込む必要があるため、ディスク容量が使い果たされると、業務が中断される可能性があります。次の機能は、現在のシステム内のディレクトリのディスク容量使用量を検出できます。入力パラメータ 検出する必要があるディレクトリ名については、df を使用してシステムのディスク領域使用量情報を出力し、grep と awk でフィルタリングして、特定のディレクトリのディスク領域使用率を取得します。 サンプルデモ: 1) ソースプログラム(検出ディレクトリは/boot) 2) 結果出力 上記の出力から、この Linux サーバー システムの /boot ディレクトリ内のディスク領域の 14% が使用されていることがわかります。これは正常であり、使用量アラーム制限の 90% を超えていません。 4) コマンドの紹介 df: ファイル システムのディスク領域の使用状況を確認します。このコマンドを使用すると、ハードディスク上で占有されているスペースの量や現在残っているスペースの量などの情報を取得できます。 パラメータ: -k k バイト単位で表示します。 概要 Linux プラットフォームでは、シェル スクリプト監視はサーバーとプロセスを監視するための非常にシンプルで便利で効果的な方法であり、システム開発者やプロセス保守者にとって非常に役立ちます。上記の情報を監視してアラームを送信するだけでなく、プロセスログやその他の情報も監視できます。この記事が皆様のお役に立てれば幸いです。
プロセスが開始されていない可能性があります。次の関数は、プロセス ID が存在するかどうかを確認します。プロセスが実行されていない場合、出力は次のようになります。
プロセスが存在しません。
# プロセスが存在するかどうかを確認します
If [ "-$PID" == "-" ]
それでは
{
echo "プロセスが存在しません。"
}
ふぃ
関数 GetCpu
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | '{print $1}'`
echo $CpuValue
}
次の関数は、上記の関数 GetCpu を通じてこのプロセスの CPU 使用率を取得し、条件ステートメントを使用して CPU 使用率が制限を超えているかどうかを判断します (実際の状況に応じて調整可能)。アラームが出力され、それ以外の場合は通常の情報が出力されます。
関数 CheckCpu
{
PID=$1
cpu=`GetCpu $PID`
If [ $cpu -gt 80 ]
それでは
{
echo 「CPU の使用率が 80% を超えています」
}
それ以外
{
echo 「CPU の使用率は正常です」
}
フィ
}
チェックCPU 11426
2) 結果出力
CPUの使用率は75です
CPUの使用率は正常です
[dyu@xilinuxbldsrv シェル]$
3) 結果分析
関数 GetMem
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
echo $MEMUsage
}
次の関数は、上記の関数 GetMem を通じてこのプロセスのメモリ使用量を取得し、条件ステートメントを使用してメモリ使用量が制限を超えているかどうかを判断します (実際の状況に応じて調整できます)。アラームが出力され、それ以外の場合は通常の情報が出力されます。
mem=`GetMem $PID`
if [ $mem -gt 1600 ]
それから
{
echo 「メモリの使用量が 1.6G を超えています」
}
それ以外
{
echo 「メモリの使用量は正常です」
}
ふぃ
echo "メモリの使用量は $mem M です"
If [ $mem -gt 1600 ]
それでは
{
echo "メモリの使用量が 1.6G を超えています"
}
それ以外
{
echo "メモリの使用量は正常です"
}
ふぃ
メモリの使用量は正常です
[dyu@xilinuxbldsrv シェル]$
{
DES=`ls /proc/$1/fd`
エコー $DES
}
if [ $des -gt 900 ]
それから
{
echo 「デスの数が 900 を超えています」
}
それ以外
{
echo 「デスの数は正常です」
}
ふぃ
des=`GetDes 11426`
echo "des の数は $des です"
If [ $des -gt 900 ]
それでは
{
echo "デスの数が 900 を超えています"
}
それ以外
{
echo "デスの数は正常です"
}
ふぃ
デス数は528です
デス数は普通です
[dyu@xilinuxbldsrv シェル]$
3) 結果分析
関数 リスニング
{
TCPListeningnum=`netstat -an grep ":$1 " |
awk '$1 == "tcp" && $NF == "LISTEN" {print $0}'
UDPListeningnum=`netstat -an|grep ":$1 " n
|awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}'
(( Listeningnum = TCPListeningnum UDPListeningnum ))
If [ $Listeningnum == 0 ]
それでは
{
エコー「0」
}
それ以外
{
エコー「1」
}
フィ
}
1) ソース プログラム (たとえば、ポート 8080 のステータスをクエリして、リッスンしているかどうかを確認します)
If [ $isListen -eq 1 ]
それでは
{
echo "ポートはリッスンしています"
}
それ以外
{
echo "ポートがリッスンしていません"
}
ふぃ
[dyu@xilinuxbldsrv シェル]$
3) 結果分析
次の関数は、特定の TCP または UDP ポートが正常な状態であるかどうかも検出します。
tcp: netstat -an|egrep $1 |awk '$6 == "LISTEN" && $1 == "tcp" {print $0}'
udp: netstat -an|egrep $1 |awk '$1 == "udp" && $5 == "0.0.0.0:*" {print $0}'
コマンド紹介
Runnum=`ps -v vi | grep -v grep "[ /]CFTestApp" |
{
CpuIdle=`vmstat 1 5 |sed -n '3,$p' n
|awk '{x = x $15} END {print x/5}' |awk -F '{print $1}'
CpuNum=`echo "100-$CpuIdle" bc`
エコー $CpuNum
}
echo "システム CPU は $cpu です"
if [ $cpu -gt 90 ]
それから
{
echo "システム CPU の使用率が 90% を超えています"
}
それ以外
{
echo "システム CPU の使用率は正常です"
}
ふぃ
システム CPU の使用率は正常です
[dyu@xilinuxbldsrv シェル]$
パラメータ: -n は、出力ヘッダー情報が周期的なループ出力中に 1 回だけ表示されることを示します。
関数 GetDiskSpc
{
If [ $# -ne 1 ]
それでは
1 を返す
フィ
フォルダー="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'
echo $DiskSpace
}
フォルダー="/ブート"
DiskSpace=`GetDiskSpc $Folder`
echo "システムの $Folder ディスク容量は $DiskSpace% です"
if [ $DiskSpace -gt 90 ]
それから
{
echo "システムディスク($Folder)の使用量が90%を超えています"
}
それ以外
{
echo "システムディスク($Folder)の使用状況は正常です"
}
ふぃ
システム/ブートディスク容量は 14% です
システムディスク(/boot)の使用状況は正常です
[dyu@xilinuxbldsrv シェル]$
3) 結果分析