最近做系統維護的時候,發現系統裡面總有那麼幾個程序的記憶體佔用量不斷的在往**,直接導致整個系統崩潰。因為該伺服器上同時還執行著其他幾個服務程序,為了不讓其受到影響,就寫了個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 以下是我自己的理解 從上面可以看...