程序記憶體占用監控指令碼

2021-06-13 23:48:36 字數 2582 閱讀 4897

最近做系統維護的時候,發現系統裡面總有那麼幾個程序的記憶體佔用量不斷的在往**,直接導致整個系統崩潰。因為該伺服器上同時還執行著其他幾個服務程序,為了不讓其受到影響,就寫了個shell指令碼,發現有程序的記憶體佔用率達到上限時,就將其殺死。

該指令碼可以既可以根據指定的程序號進行監控,也可以根據正規表示式指定程序名進行監控。

具體**如下:

#! /bin/bash

pname=

pid=

mem=

sec=1

usage="$(basename $0) -[n 程序名] -[p 程序id] -[s 監視間隔時間(單位:秒)] -[m 記憶體占用上限(單位:位元組,可以通過k,m,g,k,m,g,%指定單位)]"

while getopts n:p:s:m: opt

do case $opt in

n)pname=$optarg

;;p)pid=$optarg

;;s)sec=$optarg

;;m)mem=$optarg

;;\?) echo $usage >&2;exit 1

;;esac

done

echo $mem|grep ^[0-9,.]*[0-9,k,m,g,k,m,g,%]$ >/dev/null

if [ $? -gt 0 ];then

echo "$mem詞法錯誤" >&2

echo $usage >&2

exit 1

fimem=$(echo $mem|tr "[a-z]" "[a-z]")

len=$

unit=$(echo $mem|cut -c $len)

case $unit in

k) mem=$(echo $mem|cut -c 1-$[len-1])

mem=$[mem*1024]

;; m)

mem=$(echo $mem|cut -c 1-$[len-1])

mem=$[mem*1024*1024]

;; g)

mem=$(echo $mem|cut -c 1-$[len-1])

mem=$[mem*1024*1024*1024]

;; %)

mem=$(echo $mem|cut -c 1-$[len-1])

;; \?)

;;esac

while true;do

date

if [ -n "$pid" ];then

ents=$(ps -e -o pid= -o vsz= -o pmem= -o pcpu= -o comm=|grep ^$pid)

elif [ -n "$pname" ];then

ents=$(ps -e -o pid= -o vsz= -o pmem= -o pcpu= -o comm=|grep $pname$)

else

echo "指定程序檢索條件">&2

echo $usage >&2

exit 1

fi if [ -z "$ents" ];then

echo "沒有符合檢索條件的程序"

exit 0

fi fields=($ents)

echo "符合檢索條件的程序資訊:"

echo "【pid】 【vsz(單位:k)】 【pmem】 【pcpu】 【comm】"

for ((i=0; i<$;i++))

do printf " $ "

if [ $[ i%5 ] -eq 4 ];then

printf \\n

fidone

#按照記憶體的佔用率進行監控

if [ $unit == "%" ];then

pos=2

pmem=$

while [ -n "$pmem" ];do

echo "$pmem $mem"|awk '($1>=$2)'

if [ $? -eq 1 ];then

pid=$

comm=$

echo "殺死$pid:$comm程序【記憶體佔用率$pmem>=$mem】"

kill -9 $pid

fipos=$[pos+5]

pmem=$

done

else

#按照記憶體的佔用量進行監控

pos=1

vsz=$

while [ -n "$vsz" ];do

vsz=$[vsz*1024]

if [ $vsz -ge $mem ];then

pid=$

comm=$

echo "殺死$pid:$comm程序的【記憶體占用數量$vsz>=$mem】"

kill -9 $pid

fipos=$[pos+5]

vsz=$

done

fi echo ""

if [ $sec -gt 0 ];then

sleep $sec

else

exit 0

fi done

Linux下實現指令碼監測特定程序占用記憶體情況

記憶體洩露是c c 程式設計師經常需要面對的問題,除了有效地經常查詢出記憶體洩露的位置外,在嵌入式的開發中,還經常需要確定自己寫的程式是否存在記憶體洩露的情況 linux系統下,我們可以利用以下命令來獲取特定程序的運 況 cat proc pid status 其中pid是具體的程序號,這個命令列印...

ubuntu shell 監控某個程序占用的資源

bin bash pid 19462 宣告乙個變數,值為你需要監控的程序的pid,這個pid可以通過top命令拿到 interval 10 監控的時間間隔,值為10秒 while true while迴圈,條件設定為真會一直執行 do 標誌迴圈體開始 echo date y m d h m s lo...

linux 檢視程序占用記憶體

top b n 1 grep opera awk cpu 0.0 mem 26.4 其中 rss 程序實際占用物理記憶體大小 vsz 任務虛擬位址空間的大小 root localhost cat proc self statm 654 57 44 0 0 334 0 以下是我自己的理解 從上面可以看...