Shell腳本實作Linux系統與行程資源監控_基礎知識
在伺服器運維過程中,經常需要對伺服器的各種資源進行監控,例如:CPU的負載監控,磁碟的使用率監控,進程數目監控等等,以在系統出現異常時及時報警,通知系統管理員。本文介紹在Linux系統下幾種常見的監控需求及其shell腳本的編寫。
文章目錄:
1.Linux使用 Shell 檢查進程是否存在
2.Linux使用 Shell偵測進程 CPU 使用率
3.Linux使用 Shell偵測進程記憶體使用量
4.Linux使用 Shell偵測進程句柄使用量
5.Linux使用 Shell查看某個 TCP 或 UDP 連接埠是否在監聽
6.Linux使用 Shell查看某個進程名稱正在運作的個數
7.Linux使用 Shell偵測系統 CPU 負載
8.Linux使用 Shell偵測系統磁碟空間
9.總結
檢查進程是否存在
在對進程進行監控時,我們一般需要得到該進程的ID,進程ID 是進程的唯一標識,但是有時可能在伺服器上不同用戶下運行著多個相同進程名的進程,下面的函數GetPID給出了獲取指定用戶下指定進程名的進程ID 功能(目前只考慮這個用戶下啟動一個此進程名的進程),它有兩個參數為用戶名和進程名,它首先使用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 dbxn
|grep -v tail|grep -v start|grep -v stop |sed -n 1p |awk '{print $1}'`
echo $pid
}
範例示範:
1)原始程式(例如尋找使用者為 root,進程名為 CFTestApp 的進程 ID)
PID=`GetPID root CFTestApp`
echo $PID
2)結果輸出
11426
[dyu@xilinuxbldsrv shell]$
3)結果分析
從上面的輸出可見:11426 為 root 使用者下的 CFTestApp 程式的進程 ID。
4)指令介紹
1. ps: 查看系統中瞬間進程資訊。 參數:-u 列出屬於該使用者的程式的狀況,也可使用使用者名稱來指定。 -p 指定行程識別碼,並列出該行程的狀況。 -o 指定輸出格式 2. grep: 用於尋找檔案中符合字串的目前行。 參數:-v 反向選擇,亦即顯示沒有 ‘搜尋字串' 內容的那一行。 3. sed: 一個非互動性文字編輯器,它編輯文件或標準輸入匯出的文件,一次只能處理一行內容。 參數:-n 讀取下一個輸入行,用下一個指令處理新的行而不是用第一個指令。 p 標誌 列印匹配行 4. awk:一種程式語言,用於在 linux/unix 下處理文字和資料。資料可以來自標準輸入、一個或多個文件,或其它命令的輸出。它支援用戶自訂函數和動態正規表示式等先進功能,是 linux/unix 下的強大程式設計工具。它在命令列中使用,但更多是作為腳本來使用。 awk 的處理文字和資料的方式:它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,並在這些行上進行你想要的操作。如果沒有指定處理動作,則將符合的行顯示到標準輸出 ( 螢幕 ),如果沒有指定模式,則所有被操作所指定的行都被處理。 參數:-F fs or –field-separator fs :指定輸入檔案摺分隔符,fs 是一個字串或是一個正規表示式,如 -F:。
有時有可能進程沒有啟動,下面的功能是檢查進程 ID 是否存在,如果此進程沒有運行輸出:
The process does not exist.
# 檢查進程是否存在
if [ "-$PID" == "-" ]
then
{
echo "The process does not exist."
}
fi
偵測進程 CPU 使用率
在維護應用服務時,我們經常遇到由於 CPU 過高而導致業務阻塞,造成業務中斷的情況。 CPU 過高可能由於業務量過負荷或出現死循環等異常情況,透過腳本對業務進程CPU 進行時時監控,可以在CPU 使用率異常時及時通知維護人員,以便於維護人員及時分析,定位,以及避免業務中斷等。下面的函數可取得指定進程 ID 的進程 CPU 使用率。它有一個參數為進程ID,它首先使用ps 查找進程信息,同時通過grep -v 過濾掉%CPU 行,最後通過awk 查找CPU 利用百分比的整數部分(如果系統中有多個CPU,CPU 利用率可以超過100%)。
清單 2. 對業務進程 CPU 進行即時監控
function GetCpu
{
CpuValue=`ps -p $1 -o pcpu |grep -v CPU | awk '{print $1}' | awk - F. '{print $1}'`
echo $CpuValue
}
以下的功能是透過上面的函數GetCpu 獲得此進程的CPU 使用率,然後透過條件語句判斷CPU 使用率是否超過限制,如果超過80%(可以根據實際情況進行調整),則輸出告警,否則輸出正常訊息。
清單 3. 判斷 CPU 使用率是否超過限制
function CheckCpu
{
PID=$1
cpu=`GetCpu $PID`
if [ $cpu -gt 80 ]
then
{
echo “The usage of cpu is larger than 80%”
}
else
{
echo “The usage of cpu is normal”
}
fi
}
範例示範:
1)原始程式(假設上面已經查詢出 CFTestApp 的進程 ID 為 11426)
CheckCpu 11426
2)結果輸出
The usage of cpu is 75
The usage of cpu is normal
[dyu@xilinuxbldsrv shell]$
3)結果分析
從上面的輸出可見:CFTestApp 程式目前的 CPU 使用為 75%,是正常的,沒有超過 80% 的警告限制。
偵測進程記憶體使用量
在對應用程式服務進行維護時,也經常遇到由於記憶體使用過大導致進程崩潰,造成業務中斷的情況(例如32 位元程式可尋址的最大記憶體空間為4G,如果超出將申請記憶體失敗,同時物理記憶體也是有限的)。記憶體使用過高可能由於記憶體洩露,訊息堆積等情況,透過腳本對業務進程記憶體使用量進行時時監控,可以在記憶體使用量異常時及時發送警告(例如透過簡訊),便於維護人員及時處理。下面的函數可獲得指定進程 ID 的進程記憶體使用量。它有一個參數為進程 ID,它首先使用 ps 查找進程信息,同時通過 grep -v 過濾掉 VSZ 行 , 然後通過除 1000 取以兆為單位的內存使用量。
清單 4. 對業務進程記憶體使用量進行監控
function GetMem
{
MEMUsage=`ps -o vsz -p $1|grep -v VSZ`
(( MEMUsage /= 1000))
echo $MEMUsage
}
以下的功能是透過上面的函數 GetMem獲得此進程的記憶體使用,然後透過條件語句判斷記憶體使用是否超過限制,如果超過 1.6G(可以根據實際情況進行調整),則輸出告警,否則輸出正常資訊。
清單 5. 判斷記憶體使用量是否超過限制
mem=`GetMem $PID`
if [ $mem -gt 1600 ]
then
{
echo “The usage of memory is larger than 1.6G”
}
else
{
echo “The usage of memory is normal”
}
fi
範例示範:
1)原始程式(假設上面已經查詢出 CFTestApp 的進程 ID 為 11426)
mem=`GetMem 11426`
echo "The usage of memory is $mem M"
if [ $mem -gt 1600 ]
then
{
echo "The usage of memory is larger than 1.6G"
}
else
{
echo "The usage of memory is normal"
}
fi
2)結果輸出
The usage of memory is 248 M
The usage of memory is normal
[dyu@xilinuxbldsrv shell]$
3)結果分析
從上面的輸出可見:CFTestApp 程式目前的記憶體使用為 248M,是正常的,沒有超過 1.6G 的警告限制。
偵測進程句柄使用量
在對應用程式服務進行維護時,也經常遇到由於句柄使用 過量導致業務中斷的情況。每個平台對進程的句柄使用都是有限的,例如在Linux 平台,我們可以使用ulimit – n 命令(open files (-n) 1024)或者對/etc/security/limits.conf 的內容進行查看,得到進程句柄限制。句柄使用過高可能由於負載過高,句柄洩漏等情況,透過腳本對業務進程句柄使用量進行時時監控,可以在異常時及時發送告警(例如透過簡訊),以便於維護人員及時處理。下面的函數可取得指定進程 ID 的進程句柄使用情況。它有一個參數為進程 ID,它首先使用 ls 輸出進程句柄訊息,然後透過 wc -l 統計輸出句柄個數。
function GetDes
{
DES=`ls /proc/$1/fd | wc -l`
echo $DES
}
下面功能是透過上面的函數GetDes獲得此程序的句柄使用量,然後透過條件語句判斷句柄使用是否超過限制,如果超過900(可以根據實際情況進行調整)個,則輸出告警,否則輸出正常資訊.
des=` GetDes $PID`
if [ $des -gt 900 ]
then
{
echo “The number of des is larger than 900”
}
else
{
echo “The number of des is normal”
}
fi
範例示範:
1)原始程式(假設上面查詢出 CFTestApp 的進程 ID 為 11426)
des=`GetDes 11426`
echo "The number of des is $des"
if [ $des -gt 900 ]
then
{
echo "The number of des is larger than 900"
}
else
{
echo "The number of des is normal"
}
fi
2)結果輸出
The number of des is 528
The number of des is normal
[dyu@xilinuxbldsrv shell]$
3)結果分析
從上面的輸出可見:CFTestApp 程式目前的句柄使用為 528 個,是正常的,沒有超過 900 個的警告限制。
4)指令介紹
wc: 統計指定檔案中的位元組數、字數、行數 , 並將統計結果顯示輸出。 參數:-l 統計行數。 -c 統計位元組數。 -w 統計字數。
查看某個 TCP 或 UDP 連接埠是否在監聽
連接埠偵測是系統資源偵測經常遇到的,特別是在網路通訊情況下,連接埠狀態的偵測往往是很重要的。有時可能進程,CPU,記憶體等處於正常狀態,但是連接埠處於異常狀態,業務也是沒有正常運作。下列函數可判斷指定連接埠是否在監聽。它有一個參數為待檢測端口,它首先使用netstat 輸出端口佔用信息,然後通過grep, awk,wc 過濾輸出監聽TCP 端口的個數,第二條語句為輸出UDP 端口的監聽個數,如果TCP 與UDP 連接埠監聽皆為0,回傳0,否則回傳1.
清單 6. 連接埠偵測
function Listening
{
TCPListeningnum=`netstat -an | grep ":$1 " | n
awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l`
UDPListeningnum=`netstat -an|grep ":$1 " n
|awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l`
(( Listeningnum = TCPListeningnum UDPListeningnum ))
if [ $Listeningnum == 0 ]
then
{
echo "0"
}
else
{
echo "1"
}
fi
}
範例示範:
1)原始程式(例如查詢 8080 連接埠的狀態是否在監聽)
isListen=`Listening 8080`
if [ $isListen -eq 1 ]
then
{
echo "The port is listening"
}
else
{
echo "The port is not listening"
}
fi
2)結果輸出
The port is listening
[dyu@xilinuxbldsrv shell]$
3)結果分析
從上面的輸出可見:這個 Linux 伺服器的 8080 連接埠處在監聽狀態。
4)指令介紹
netstat: 用於顯示與 IP、TCP、UDP 和 ICMP 協定相關的統計數據,一般用於檢驗本機各連接埠的網路連線情況。 參數:-a 顯示所有連線中的 Socket。 -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 不同點在於解讀字串的方法,egrep 是用擴展的正規表示式語法來解讀,而grep 則用基本的正規表示式語法,擴展的正規表示式比基本的正規表示式有更完整的表達式規範。
查看某個行程名稱正在運作的個數
有時我們可能需要得到伺服器上某個行程的啟動個數,下面的功能是偵測某個行程正在執行的個數,例如行程名稱為 CFTestApp。
Runnum=`ps -ef | grep -v vi | grep -v tail | grep "[ /]CFTestApp" | grep -v grep | wc -l
偵測系統 CPU 負載
在對伺服器進行維護時,有時也遇到由於系統 CPU(利用率)負載 過量導致業務中斷的情況。伺服器上可能運行多個進程,查看單一進程的 CPU 都是正常的,但是整個系統的 CPU 負載可能是異常的。透過腳本對系統 CPU 負載進行時時監控,可以在異常時及時發送告警,以便於維護人員及時處理,預防事故發生。下面的函數可以偵測系統 CPU 使用情況 . 使用 vmstat 取 5 次系統 CPU 的 idle 值,取平均值,然後透過與 100 取差得到目前 CPU 的實際佔用值。
function 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`
echo $CpuNum
}
範例示範:
1)原始程式
cpu=`GetSysCPU`
echo "The system CPU is $cpu"
if [ $cpu -gt 90 ]
then
{
echo "The usage of system cpu is larger than 90%"
}
else
{
echo "The usage of system cpu is normal"
}
fi
2)結果輸出
The system CPU is 87
The usage of system cpu is normal
[dyu@xilinuxbldsrv shell]$
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 プラットフォームでは、シェル スクリプト監視はサーバーとプロセスを監視するための非常にシンプルで便利で効果的な方法であり、システム開発者やプロセス保守者にとって非常に役立ちます。上記の情報を監視してアラームを送信するだけでなく、プロセスログやその他の情報も監視できます。この記事が皆様のお役に立てれば幸いです。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

<p>自訂您的作業系統是讓您的日常生活更加愉快的絕佳方式。您可以變更使用者介面、套用自訂主題、新增小工具等等。因此,我們今天將向您展示如何在Windows11上安裝ClassicShell。 </p><p>程式已經存在了很長時間,並允許您修改作業系統。志工現在已經開始運作該組織,該組織於2017年解散。新專案名為OpenShell,目前在Github上可供有興趣的人使用。 </p>&a

無法在Windows 11上運行的 Open shell 並不是一個新問題,而且自從這個新作業系統問世以來一直困擾著使用者。 Open-Shell Windows 11 不工作問題的原因並不具體。它可能是由程式中的意外錯誤、病毒或惡意軟體的存在或損壞的系統檔案引起的。對於不知道的人,Open-Shell 是 2017 年停產的 Classic Shell 的替代品。您可以查看我們的教學課程,以了解如何在 Windows 11 上安裝 Classic Shell。如何替換 Windows 11 的開始菜

您在執行腳本時是否看到此錯誤訊息「Add-AppxPackage:部署失敗,HRESULT:0x80073D02,無法安裝該包,因為它修改的資源目前正在使用中。PowerShell中出現錯誤0x80073D02…」?如錯誤訊息所述,當使用者在前一個進程執行時嘗試重新註冊一個或所有WindowsShellExperienceHost應用程式時,確實會發生這種情況。我們已經獲得了一些簡單的解決方案來快速解決這個問題。修復1–終止體驗主機程序您必須在執行powershell指令之前結束
![探險家.exe 在系統啟動時不啟動 [修復]](https://img.php.cn/upload/article/000/887/227/168575230155539.png?x-oss-process=image/resize,m_fill,h_207,w_330)
如今,許多Windows用戶開始遇到嚴重的Windows系統問題。問題是系統載入後Explorer.exe無法啟動,使用者無法開啟檔案或資料夾。雖然,Windows使用者在某些情況下可以使用命令提示字元手動開啟Windows資源管理器,並且每次系統重新啟動或系統啟動後都必須這樣做。這可能是有問題的,並且是由於下面提到的以下因素造成的。損壞的系統檔案。啟用快速啟動設定。過時或有問題的顯示驅動程式。對系統中的某些服務進行了更改。修改後的註冊表文件。請記住以上所有因素,我們提出了一些肯定會對用戶有所幫助

適用於 Linux 的 Windows 子系統第一種選擇是使用適用於 Linux 或 WSL 的 Windows 子系統,這是一個相容層,用於在 Windows 系統上本機執行 Linux 二進位執行檔。它適用於大多數場景,允許您在 Windows 11/10 中執行 shell 腳本。 WSL 不會自動可用,因此您必須透過 Windows 裝置的開發人員設定來啟用它。您可以透過前往設定 > 更新和安全性 > 對於開發人員來完成。切換到開發人員模式並透過選擇是確認提示。接下來,找 W

Linux系統下在處理檔案時,有時候需要刪除檔案末端的行。這種操作在實際應用中很常見,可以透過一些簡單的命令來實現。本文將介紹在Linux系統中快速刪除檔案結尾行的操作步驟,同時提供具體的程式碼範例。步驟一:檢視文件末尾行在進行刪除操作之前,首先需要確認文件的末尾行是哪一行。可以使用tail指令來查看文件的結尾行,具體指令如下:tail-n1filena

OpenShell是一個免費的軟體實用程序,可用於自訂Windows11開始選單,使其類似於經典風格的選單或Windows7樣式的選單。先前版本的Windows上的開始功能表為使用者提供了一種瀏覽其係統內容的簡單方法。基本上,OpenShell是ClassicShell的替代品,它提供了不同的使用者介面元素,有助於從先前的Windows版本取得後一個版本的功能。一旦ClassicShell的開發在2017年停止,它就由GitHub志工以OpenShell的名義維護和開發。它與Win

Python 腳本部分範例:企業微信警告、FTP 用戶端、SSH 用戶端、Saltstack 用戶端、vCenter 用戶端、取得網域名稱ssl 憑證過期時間、傳送今天的天氣預報以及未來的天氣趨勢圖;Shell 腳本部分實例:SVN完整備份、Zabbix 監控使用者密碼過期、建置本地YUM 以及上篇文章中有讀者的需求(負載高時,查出佔用比較高的進程腳本並儲存或推播通知);篇幅有些長,也請大家耐心翻到文末,畢竟有彩蛋。 Python 腳本部分企業微信警告此腳本透過企業微信應用,進行微信告警,可用於
