ホームページ > ウェブフロントエンド > jsチュートリアル > Linuxシステムとプロセスリソース監視をシェルスクリプトで実装_基礎知識

Linuxシステムとプロセスリソース監視をシェルスクリプトで実装_基礎知識

WBOY
リリース: 2016-05-16 16:10:57
オリジナル
2107 人が閲覧しました

サーバーの運用と保守のプロセスでは、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. プロセスを監視する

コードをコピーします コードは次のとおりです:

関数 GetPID #ユーザー #名前
{
PsUser=$1
PsName=$2
pid=`ps -u $PsUser|grep $PsName|grep -v grep|grep -v vi|grep -v dbxn
|grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
エコー $pid
}

サンプルデモ:

1) ソースプログラム (たとえば、ユーザーが root、プロセス名が CFTestApp であるプロセス ID を検索します)

コードをコピー コードは次のとおりです:

PID=`GetPID ルート CFTestApp`

エコー $PID

2) 結果出力

コードをコピーします コードは次のとおりです:

11426
[dyu@xilinuxbldsrv シェル]$

3) 結果分析

上記の出力からわかるように、11426 は root ユーザーの下の CFTestApp プログラムのプロセス ID です。

4) コマンドの紹介

1. ps: システム内のインスタントプロセス情報を表示します。 パラメータ: -u このユーザーに属するプログラムのステータスを一覧表示します。これはユーザー名を使用して指定することもできます。 -p はプロセス識別子を指定し、プロセスのステータスを一覧表示します。 -o は出力形式を指定します。 2. grep: 文字列に一致するファイル内の現在の行を検索するために使用されます。 パラメータ: -v 逆選択。つまり、「検索文字列」の内容を含まない行を表示します。 3. sed: ファイルまたは標準入力からエクスポートされたファイルを編集する非対話型テキスト エディターで、一度に 1 行のコンテンツのみを処理できます。 パラメータ: -n 次の入力行を読み取り、最初のコマンドの代わりに次のコマンドを使用して新しい行を処理します。 p フラグは一致する行を出力します。 4. awk: Linux/unix でのテキストおよびデータ処理に使用されるプログラミング言語。データは、標準入力、1 つ以上のファイル、または他のコマンドの出力から取得できます。ユーザー定義関数や動的正規表現などの高度な機能をサポートしており、Linux/UNIX での強力なプログラミング ツールです。コマンドラインから使用されますが、スクリプトとして使用されることが多くなります。 awk がテキストとデータを処理する方法: ファイルを最初の行から最後の行まで 1 行ずつスキャンして、特定のパターンに一致する行を探し、それらの行に対して必要な操作を実行します。処理アクションが指定されていない場合は、一致する行が標準出力 (画面) に表示されます。モードが指定されていない場合は、操作で指定されたすべての行が処理されます。 パラメータ: -F fs または –field-separator fs: 入力ファイルの折り目区切り文字を指定します。fs は文字列または正規表現 (-F: など) です。
プロセスが開始されていない可能性があります。次の関数は、プロセス ID が存在するかどうかを確認します。プロセスが実行されていない場合、出力は次のようになります。

コードをコピー コードは次のとおりです:

プロセスが存在しません。
# プロセスが存在するかどうかを確認します
If [ "-$PID" == "-" ]
それでは
{
echo "プロセスが存在しません。"
}
ふぃ

プロセスの CPU 使用率を検出

アプリケーション サービスを保守していると、CPU の負荷が高くなりすぎて、ビジネスの輻輳やビジネスの中断が発生する状況がよく発生します。過剰な CPU は、ビジネスの過負荷や無限ループなどの異常な状況が原因である可能性があります。ビジネス プロセスの CPU はスクリプトを通じて常に監視されており、CPU 使用率が異常な場合には保守担当者に通知されるため、保守担当者の分析、特定が容易になります。業務の中断などを適時回避する。次の関数は、指定されたプロセス ID のプロセス CPU 使用率を取得します。これにはプロセス ID のパラメーターがあり、まず ps を使用してプロセス情報を検索し、同時に grep -v で %CPU 行を除外し、最後に awk を使用して CPU 使用率の整数部分を検索します (複数ある場合)。システム内の CPU の場合、CPU 使用率が 100% を超える場合があります)。

リスト 2. ビジネス プロセス CPU のリアルタイム監視

コードをコピーします コードは次のとおりです:

関数 GetCpu
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | '{print $1}'`
echo $CpuValue
}

次の関数は、上記の関数 GetCpu を通じてこのプロセスの CPU 使用率を取得し、条件ステートメントを使用して CPU 使用率が制限を超えているかどうかを判断します (実際の状況に応じて調整可能)。アラームが出力され、それ以外の場合は通常の情報が出力されます。

リスト 3. CPU 使用率が制限を超えているかどうかを判断します

コードをコピーします コードは次のとおりです:

関数 CheckCpu
{
PID=$1
cpu=`GetCpu $PID`
If [ $cpu -gt 80 ]
それでは
{
echo 「CPU の使用率が 80% を超えています」
}
それ以外
{
echo 「CPU の使用率は正常です」
}
フィ
}

サンプルデモ:

1) ソース プログラム (CFTestApp のプロセス ID が 11426 として上記でクエリされたと仮定します)

コードをコピー コードは次のとおりです:

チェックCPU 11426

2) 結果出力
コードをコピー コードは次のとおりです:

CPUの使用率は75です
CPUの使用率は正常です
[dyu@xilinuxbldsrv シェル]$

3) 結果分析

上記の出力からわかるように、CFTestApp プログラムの現在の CPU 使用率は 75% であり、これは正常であり、アラーム制限の 80% を超えません。

プロセスのメモリ使用量を検出します

アプリケーション サービスを保守するとき、過剰なメモリ使用量によりプロセスがクラッシュし、ビジネスの中断を引き起こす状況によく遭遇します (たとえば、32 ビット プログラムの最大アドレス指定可能なメモリ空間は 4G です。これを超えると、メモリがアプリケーションは失敗し、物理メモリも制限されます)。過剰なメモリ使用量は、メモリ リークやメッセージの蓄積などが原因である可能性があります。ビジネス プロセスのメモリ使用量は、スクリプトを通じて常に監視されており、メモリ使用量が異常な場合には、アラームが(SMS などを通じて)送信されます。メンテナンス担当者がタイムリーに対応できます。次の関数は、指定されたプロセス ID のプロセス メモリ使用量を取得します。これにはプロセス ID のパラメーターがあり、まず ps を使用してプロセス情報を検索し、同時に grep -v で VSZ 行を除外し、次に 1000 で割ってメモリ使用量をメガバイト単位で取得します。

リスト 4. ビジネス プロセスのメモリ使用量を監視する

コードをコピー コードは次のとおりです:

関数 GetMem
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
echo $MEMUsage
}

次の関数は、上記の関数 GetMem を通じてこのプロセスのメモリ使用量を取得し、条件ステートメントを使用してメモリ使用量が制限を超えているかどうかを判断します (実際の状況に応じて調整できます)。アラームが出力され、それ以外の場合は通常の情報が出力されます。

リスト 5. メモリ使用量が制限を超えているかどうかを判断する

コードをコピー コードは次のとおりです:

mem=`GetMem $PID` if [ $mem -gt 1600 ]
それから
{
echo 「メモリの使用量が 1.6G を超えています」
}
それ以外
{
echo 「メモリの使用量は正常です」
}
ふぃ

サンプルデモ:

1) ソース プログラム (CFTestApp のプロセス ID が 11426 として上記でクエリされたと仮定します)


コードをコピー コードは次のとおりです:
mem=`GetMem 11426`

echo "メモリの使用量は $mem M です"

If [ $mem -gt 1600 ]
それでは
{
echo "メモリの使用量が 1.6G を超えています"
}
それ以外
{
echo "メモリの使用量は正常です"
}
ふぃ

2) 結果出力

コードをコピーします コードは次のとおりです:
メモリ使用量は248Mです
メモリの使用量は正常です
[dyu@xilinuxbldsrv シェル]$

3) 結果分析

上記の出力からわかるように、CFTestApp プログラムの現在のメモリ使用量は 248M ですが、これは正常であり、1.6G のアラーム制限を超えません。

プロセス ハンドルの使用状況を検出

アプリケーション サービスを保守する際、ハンドルの過剰な使用によるビジネスの中断に遭遇することがよくあります。各プラットフォームでのプロセス ハンドルの使用は制限されています。たとえば、Linux プラットフォームでは、ulimit –n コマンド (ファイルを開く (-n) 1024) を使用するか、/etc/security/limits.conf の内容を表示できます。プロセスハンドル制限を取得します。過剰なハンドル使用量は、過剰な負荷やハンドル漏洩などが原因である可能性があります。ビジネス プロセスのハンドル使用量はスクリプトを通じて常に監視されており、異常が発生した場合にはアラートを (SMS などで) 送信することができるため、保守担当者は次のことが可能です。タイムリーに対処してください。次の関数は、指定されたプロセス ID のプロセス ハンドルの使用状況を取得します。これには、プロセス ID のパラメーターが 1 つあります。最初に ls を使用してプロセス ハンドル情報を出力し、次に wc -l を使用して出力ハンドルの数をカウントします。

コードをコピーします コードは次のとおりです:
関数 GetDes
{
DES=`ls /proc/$1/fd`
エコー $DES
}

次の関数は、上記の関数 GetDes を通じてこのプロセスのハンドル使用量を取得し、ハンドル使用量が 900 を超えるかどうかを条件ステートメントを使用して判断します (実際の状況に応じて調整できます)。の場合はアラームが出力され、それ以外の場合は通常の情報が出力されます。


コードをコピー コードは次のとおりです:
des=` GetDes $PID`
if [ $des -gt 900 ]
それから
{
echo 「デスの数が 900 を超えています」
}
それ以外
{
echo 「デスの数は正常です」
}
ふぃ

サンプルデモ:

1) ソースプログラム (上記クエリで見つかった CFTestApp のプロセス ID が 11426 であると仮定します)

コードをコピー コードは次のとおりです:

des=`GetDes 11426`

echo "des の数は $des です"

If [ $des -gt 900 ]
それでは
{
echo "デスの数が 900 を超えています"
}
それ以外
{
echo "デスの数は正常です"
}
ふぃ

2) 結果出力

コードをコピーします コードは次のとおりです:

デス数は528です
デス数は普通です
[dyu@xilinuxbldsrv シェル]$

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 " | 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 のステータスをクエリして、リッスンしているかどうかを確認します)


コードをコピー コードは次のとおりです:
isListen=`リスニング 8080`
If [ $isListen -eq 1 ]
それでは
{
echo "ポートはリッスンしています"
}
それ以外
{
echo "ポートがリッスンしていません"
}
ふぃ

2) 結果出力

コードをコピーします コードは次のとおりです:
ポートはリッスンしています
[dyu@xilinuxbldsrv シェル]$


3) 結果分析

上記の出力からわかるように、この Linux サーバーのポート 8080 はリスニング状態です。

4) コマンドの紹介

netstat: IP、TCP、UDP、ICMP プロトコルに関連する統計データを表示するために使用されます。通常、マシンの各ポートのネットワーク接続を確認するために使用されます。 パラメータ: -a は、接続内のすべてのソケットを表示します。 -n ドメインネームサーバーを経由せずに、IP アドレスを直接使用します。
次の関数は、特定の 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}'

コマンド紹介

egrep: ファイル内で指定された文字列を検索します。 egrep の実行効果は grep -E と似ています。使用される構文とパラメーターは grep コマンドを参照できます。grep との違いは、文字列の解釈に拡張正規表現構文を使用するのに対し、grep は基本的な正規表現を使用します。構文、拡張正規表現には、基本正規表現よりも完全な式仕様があります。

特定のプロセス名の実行プロセス数を表示

サーバー上で開始されたプロセスの数を取得する必要がある場合があります。たとえば、プロセス名は CFTestApp です。

コードをコピー コードは次のとおりです:

Runnum=`ps -v vi | grep -v grep "[ /]CFTestApp" |
システム 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 '{print $1}'
CpuNum=`echo "100-$CpuIdle" bc`
エコー $CpuNum
}

サンプルデモ:

1) ソースプログラム

コードをコピーします コードは次のとおりです:
cpu=`GetSysCPU`

echo "システム CPU は $cpu です"

if [ $cpu -gt 90 ]
それから
{
echo "システム CPU の使用率が 90% を超えています"
}
それ以外
{
echo "システム CPU の使用率は正常です"
}
ふぃ

2) 結果出力


コードをコピー コードは次のとおりです:
システムCPUは87
システム CPU の使用率は正常です
[dyu@xilinuxbldsrv シェル]$

3) 結果分析

上記の出力からわかるように、Linux サーバー システムの現在の CPU 使用率は 87% であり、これは正常であり、アラーム制限の 90% を超えません。

4) コマンドの紹介

vmstat: Virtual Meomory Statistics (仮想メモリ統計) の略称。オペレーティング システムの仮想メモリ、プロセス、CPU アクティビティを監視できます。
パラメータ: -n は、出力ヘッダー情報が周期的なループ出力中に 1 回だけ表示されることを示します。

システムのディスク容量を確認します

システムのディスク領域の検出は、システム リソースの検出の重要な部分であり、多くの場合、サーバーのディスク領域の使用状況を確認する必要があります。ビジネスによっては、通話メモ、ログ、または一時ファイルを時々書き込む必要があるため、ディスク容量が使い果たされると、業務が中断される可能性があります。次の機能は、現在のシステム内のディレクトリのディスク容量使用量を検出できます。入力パラメータ 検出する必要があるディレクトリ名については、df を使用してシステムのディスク領域使用量情報を出力し、grep と awk でフィルタリングして、特定のディレクトリのディスク領域使用率を取得します。

コードをコピーします コードは次のとおりです:

関数 GetDiskSpc
{
If [ $# -ne 1 ]
それでは
1 を返す
フィ

フォルダー="$1$"
DiskSpace=`df -k |grep $Folder |awk '{print $5}' |awk -F% '{print $1}'
echo $DiskSpace
}

サンプルデモ:

1) ソースプログラム(検出ディレクトリは/boot)


コードをコピー コードは次のとおりです:

フォルダー="/ブート"

DiskSpace=`GetDiskSpc $Folder`

echo "システムの $Folder ディスク容量は $DiskSpace% です"

if [ $DiskSpace -gt 90 ]
それから
{
echo "システムディスク($Folder)の使用量が90%を超えています"
}
それ以外
{
echo "システムディスク($Folder)の使用状況は正常です"
}
ふぃ

2) 結果出力

コードをコピーします コードは次のとおりです:

システム/ブートディスク容量は 14% です
システムディスク(/boot)の使用状況は正常です
[dyu@xilinuxbldsrv シェル]$

3) 結果分析

上記の出力から、この Linux サーバー システムの /boot ディレクトリ内のディスク領域の 14% が使用されていることがわかります。これは正常であり、使用量アラーム制限の 90% を超えていません。

4) コマンドの紹介

df: ファイル システムのディスク領域の使用状況を確認します。このコマンドを使用すると、ハードディスク上で占有されているスペースの量や現在残っているスペースの量などの情報を取得できます。 パラメータ: -k k バイト単位で表示します。

概要

Linux プラットフォームでは、シェル スクリプト監視はサーバーとプロセスを監視するための非常にシンプルで便利で効果的な方法であり、システム開発者やプロセス保守者にとって非常に役立ちます。上記の情報を監視してアラームを送信するだけでなく、プロセスログやその他の情報も監視できます。この記事が皆様のお役に立てれば幸いです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート