監控目錄、主機、程式程式

guyuanli發表於2010-10-12

1.主監控程式monitor.sh

#******************************************* #
# OS : HP-UX 11.23 #
# Remark : 排程系統監控 #
# FileName : /home/monitor/bin/monitor.sh #
# Author : sunzg #
# CreateTime : 2009-01-02 #
# Regenerator : yangdongxiao #
# UpdateTime : 2010-08-31 #
#*********************************************#

[@more@]


#*********************************************#
# 目錄結構說明 #
# #
# 指令碼 : /home/monitor/bin #
# 當次監控資訊 : /home/monitor/data #
# 未入庫的監控資訊 : /home/monitor/hisdata #
# 日誌 : /home/monitor/log #
#*********************************************#

echo '' >> /home/monitor/log/monitor.log
echo '----------------------start time '`date +%Y-%m-%d`' '`date +%H:%M:%S`'-------------------------------------' >> /home/monitor/log/monitor.log
echo '' >> /home/monitor/log/monitor.log


# 關鍵目錄
/home/monitor/bin/dir.sh
/home/monitor/bin/load.sh dir


# 主機資訊
/home/monitor/bin/host.sh
/home/monitor/bin/load.sh host


# 關鍵程式
#/home/monitor/bin/process.sh
#/home/monitor/bin/load.sh process


# 周邊系統連通
#/home/monitor/bin/link.sh
#/home/monitor/bin/load.sh link


echo '' >> /home/monitor/log/monitor.log
echo '------------------------end time '`date +%Y-%m-%d`' '`date +%H:%M:%S`'-------------------------------------' >> /home/monitor/log/monitor.log
echo '' >> /home/monitor/log/monitor.log
2.目錄監控程式dir.sh

#*******************************************#
# OS : HP-UX 11.23 #
# Remark : 監控關鍵目錄 #
# FileName : /home/monitor/bin/dir.sh #
# Author : sunzg #
# CreateTime : 2008-12-15 #
# Regenerator : yangdongxiao #
# UpdateTime : 2010-08-31 #
#*******************************************#

#*******************************************#
# 目錄結構說明 #
# #
# 指令碼 : /home/monitor/bin #
# 當次監控資訊 : /home/monitor/data #
# 未入庫的監控資訊 : /home/monitor/hisdata #
# 日誌 : /home/monitor/log #
#*******************************************#

# 獲取主機時間
SCANDATE=`date +%Y-%m-%d`
SCANTIME=`date +%H:%M:%S`

# 獲取主機名
host_name=`hostname`

# 獲取主機IP
host_ip=`cat /home/monitor/bin/ip.ini | grep $host_name | awk '{ print $2}'`

# 獲取關鍵目錄使用率
bdf | grep % | sed 's/%//g' | grep / | awk '{
dir_name = $NF
dir_all = $(NF-4)/(1024*1024)
dir_use = $(NF-3)/(1024*1024)
dir_free = dir_all-dir_use
use_rate = $(NF-1)/100

printf "'$SCANDATE' '$SCANTIME'|'$host_name'|'$host_ip'|%s|%s|%s|%s|0n", dir_name, dir_use, dir_free, use_rate

}' > /home/monitor/data/dir.dat
3.目錄控制檔案dir.ctl

LOAD DATA
INFILE "/home/monitor/data/dir.dat"
Append
INTO TABLE vgopdw.tdw_moni_sys_host_dir
FIELDS TERMINATED BY '|'
(
scan_time ,
host_name ,
host_ip ,
dir_name ,
dir_use ,
dir_free ,
dir_rate ,
flag
)
4.主機監控程式host.sh

#*******************************************#
# OS : HP-UX 11.23 #
# Remark : 監控主機資訊 #
# FileName : /home/monitor/bin/host.sh #
# Author : sunzg #
# CreateTime : 2008-12-15 #
# Regenerator : yangdongxiao #
# UpdateTime : 2010-08-31 #
#*******************************************#

#*******************************************#
# 目錄結構說明 #
# #
# 指令碼 : /home/monitor/bin #
# 當次監控資訊 : /home/monitor/data #
# 未入庫的監控資訊 : /home/monitor/hisdata #
# 日誌 : /home/monitor/log #
#*******************************************#

# 獲取主機時間
SCANDATE=`date +%Y-%m-%d`
SCANTIME=`date +%H:%M:%S`

# 獲取主機名
host_name=`hostname`

# 獲取主機IP
host_ip=`cat /home/monitor/bin/ip.ini | grep $host_name | awk '{ print $2}'`

# 獲取主機cpu使用率、記憶體使用率
# HP-UX 的top命令必須使用引數[-f]指定檔案才可以,如果使用重定向符[>],生成的檔案內容都在一行。
# top命令無法取出系統真實實體記憶體大小,目前採用手動設定。主機具體配置如下,請根據具體情況修改。

# da庫(cp-da01,cp-da02)記憶體32g
# mccdb庫(cp-mccdb01,cp-mccdb02)記憶體64g
# 應用伺服器(cp-mcc01,cp-mcc02,cp-mcc03,cp-mcc04,cp-mcc05,cp-mcc06,cp-mcc07)記憶體16g

# ALL_MEN=33554432
ALL_MEN=16746160

# 獲取主機cpu,記憶體使用率。
top -d 1 -f /home/monitor/data/host.tmp
grep -E 'avg|Memory' /home/monitor/data/host.tmp | sed 's/K//g' | awk '{
uer_cpu = $3
sys_cpu = $5
cpu_rate = (uer_cpu + sys_cpu) / 100

getline

free_Mem = $8
Mem_rate = ('$ALL_MEN'-free_Mem)/'$ALL_MEN'

printf "'$SCANDATE' '$SCANTIME'|'$host_name'|'$host_ip'|%s|%s|", cpu_rate, Mem_rate

}' > /home/monitor/data/host.dat

# 獲取磁碟流量
iostat 2 5 | sed 's/'bps'//g' | sed 's/'msps'//g' | sed 's/'sps'//g' | awk '{io = io + $2} END{print io/5"|0n"}' >> /home/monitor/data/host.dat

# 刪除臨時檔案host.tmp
rm /home/monitor/data/host.tmp
5.主機控制檔案host.ctl

LOAD DATA
INFILE "/home/monitor/data/host.dat"
Append
INTO TABLE vgopdw.tdw_moni_sys_host
FIELDS TERMINATED BY '|'
(
scan_time ,
host_name ,
host_ip ,
cpu_rate ,
mem_rate ,
disk_i ,
flag
)
6.程式監控程式process.sh

#****************************************#
# OS : HP-UX 11.23 #
# Remark : 監控關鍵程式 #
# FileName : /monitor/bin/process.sh #
# Author : #
# CreateTime : 2008-12-15 #
#****************************************#

#****************************************#
# 目錄結構說明 #
# #
# 指令碼 : /monitor/bin #
# 當次監控資訊 : /monitor/data #
# 未入庫的監控資訊 : /monitor/hisdata #
# 日誌 : /monitor/log #
#****************************************#

# 獲取主機時間
SCANDATE=`date +%Y-%m-%d`
DAY=`date +%Y%m%d`
SCANTIME=`date +%H:%M:%S`

# 獲取當前時間分鐘,為入庫提供判斷依
LOADFLG=`date +%M`

# 獲取主機名
host_name=`hostname`

# 獲取主機IP
host_ip=`cat /monitor/bin/ip.ini | grep $host_name | awk '{ print $2}'`

#********************************************
#** 函 數 名: get_mon_days()
#** 函式功能: 返回月份的天數
#** 輸入引數: 檢視月份
#********************************************
get_mon_days()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`

ra=`expr $Y % 4`
rb=`expr $Y % 100`
rc=`expr $Y % 400`

case $M in
01|03|05|07|08|10|12) days=31;;
04|06|09|11) days=30;;
esac
if [ $M -eq 02 ]
then
if [ $ra -eq 0 -a $rb -ne 0 -o $rc -eq 0 ]
then
days=29
else
days=28
fi
fi
#echo $days
}

#********************************************
#** 函 數 名: get_before_date()
#** 函式功能: 獲取昨天的日期
#** 輸入引數: 檢視日期
#********************************************
get_before_date()
{
Y=`expr substr $1 1 4`
M=`expr substr $1 5 2`
D=`expr substr $1 7 2`
YY=`expr $Y - 1`
MM=`expr $M - 1`
DD=`expr $D - 1`
MM=`printf "%02d" $MM`
DD=`printf "%02d" $DD`
dd=$Y$MM
dad=`get_mon_days $dd`
be_date=$Y-$M-$DD
if [ $D -eq 01 ]
then
if [ $M -ne 01 ]
then
be_date=$Y-$MM-$dad
fi
if [ $M -eq 01 ]
then
be_date=$YY"-12-31"
fi
fi
echo $be_date
}


# 清空資料檔案
> /monitor/data/process.dat

# 清空臨時檔案
> /monitor/bin/process.tmp

# 得到昨天的日期
BEFDAY=$(get_before_date $DAY)

# 修改配置檔案/monitor/bin/process.ini 中的程式啟動時間
while read local_name process_name process_sdate process_stime
do
if [ $local_name = $host_name ]
then

pstat=`UNIX95= ps -eo stime,comm | grep -c $process_name`

echo $process_name -- $pstat

if [ $pstat = 1 ]
then
# 正在執行的程式,獲取實際啟動時間
UNIX95= ps -eo stime,comm |
grep $process_name |
awk '{
old_cfg="'$local_name' '$process_name' '$process_sdate' '$process_stime'"
new_cfg="'$local_name' '$process_name' '$SCANDATE' "$1

if ($1 ~ /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/ && $1 < "'SCANTIME'" && $1 != "'$process_stime'" && "'$process_sdate'" != "'$SCANDATE'")
{
system("echo "new_cfg" >> /monitor/bin/process.tmp ")
}else
{
system("echo "old_cfg" >> /monitor/bin/process.tmp ")
}
getline
getline
getline
}'
fi
if [ $pstat != 1 ]
then
old_cfg="$local_name $process_name $process_sdate $process_stime"
echo $old_cfg >> /monitor/bin/process.tmp
getline
getline
getline
fi
fi
done < /monitor/bin/process.ini

echo "end reading file"

# 重新整理資訊表程式啟動時間
cat /monitor/bin/process.tmp > /monitor/bin/process.ini

# 讀取配置檔案/monitor/bin/process.ini 中的系統連通訊息
while read local_name process_name process_sdate process_stime
do
if [ $local_name = $host_name ]
then
UNIX95= ps -eo stime,comm |
grep -c $process_name |
awk '{ if ($0 != 0 )
{
printf "'$SCANDATE' '$SCANTIME'|'$host_name'|'$host_ip'|'$process_sdate' '$process_stime'|'$process_name'|0|0n"
}else
{
printf "'$SCANDATE' '$SCANTIME'|'$host_name'|'$host_ip'|'$process_sdate' '$process_stime'|'$process_name'|1|0n"
}
}' >> /monitor/data/process.dat
fi
done < /monitor/bin/process.ini

# 程式監控指令碼,在正常情況下,每5分鐘入庫一次。
case $LOADFLG in
# 若為分鐘各位為5,或0執行下面指令碼
[0-5][0,5]) /monitor/bin/load.sh process;;
# 其它時間時,執行下面指令碼(為了滿足出現異常是立即入庫,週期為1分鐘)
*) cat /monitor/data/process.dat | awk 'BEGIN{FS="|"; i = 0; } {if ($6 == 1) {i = i + 1}} END{ if (i > 0) system("/monitor/bin/load.sh process")}'
esac

7.程式控制檔案process.ctl

LOAD DATA
INFILE "/home/monitor/data/process.dat"
Append
INTO TABLE vgopdw.tdw_moni_sys_process
FIELDS TERMINATED BY '|'
(
scan_time ,
host_name ,
host_ip ,
start_time ,
process_name ,
process_state ,
flag
)
8.入ORACLE資料庫程式load.sh

#*******************************************#
# OS : HP-UX 11.23 #
# Remark : 資料入庫 #
# FileName : /home/monitor/bin/load.sh #
# Author : sunzg #
# CreateTime : 2009-01-01 #
# Regenerator : yangdongxiao #
# UpdateTime : 2010-08-31 #
#*******************************************#

#*******************************************#
# 目錄結構說明 #
# #
# 指令碼 : /home/monitor/bin #
# 當次監控資訊 : /home/monitor/data #
# 未入庫的監控資訊 : /home/monitor/hisdata #
# 日誌 : /home/monitor/log #
#*******************************************#

. /home/monitor/.profile


# 取系統時間
SCANDATE=`date +%Y-%m-%d`
SCANTIME=`date +%H:%M:%S`

ORA_USRID="vgopdw/"`/home/monitor/jiemi/jiemi.sh DA vgopdw`"@DA"

# 主機資訊監控
if [ $1 = "host" ]
then

#---------------------------- CPU & MEM ----------------------------------------

# 刪除上次入庫生成的日誌檔案
rm /home/monitor/log/host.log
# 刪除上次歷史資料入庫生成的日誌檔案
rm /home/monitor/log/host_his.log

#------入庫歷史監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/host.ctl data=/home/monitor/hisdata/host_his.dat log=/home/monitor/log/host_his.log bad=/home/monitor/log/host_his.bad

# 判斷歷史資料是否入庫成功
if [ -e /home/monitor/log/host_his.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/host_his.log` != "0" ]
then
# 日誌存在但入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load host_his.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
# 歷史資料入庫成功,清空歷史資料檔案
> /home/monitor/hisdata/host_his.dat
echo $SCANDATE' '$SCANTIME' || load host_his.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明歷史資料入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load host_his.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

#------入庫當次監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/host.ctl data=/home/monitor/data/host.dat log=/home/monitor/log/host.log bad=/home/monitor/log/host.bad

# 判斷當次監控資料入庫是否成功
if [ -e /home/monitor/log/host.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/host.log` != "0" ]
then
# 日誌存在但入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/host.dat >> /home/monitor/hisdata/host_his.dat
echo $SCANDATE' '$SCANTIME' || load host.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
echo $SCANDATE' '$SCANTIME' || load host.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/host.dat >> /home/monitor/hisdata/host_his.dat
echo $SCANDATE' '$SCANTIME' || load host.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

# 關鍵目錄監控
elif [ $1 = "dir" ]
then

#---------------------------- DISK ---------------------------------------------

# 刪除上次入庫生成的日誌檔案
rm /home/monitor/log/dir.log
# 刪除上次歷史資料入庫生成的日誌檔案
rm /home/monitor/log/dir_his.log

#------入庫歷史監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/dir.ctl data=/home/monitor/hisdata/dir_his.dat log=/home/monitor/log/dir_his.log bad=/home/monitor/log/dir_his.bad

# 判斷歷史資料是否入庫成功
if [ -e /home/monitor/log/dir_his.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/dir_his.log` != "0" ]
then
# 日誌存在但入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load dir_his.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
# 歷史資料入庫成功,清空歷史資料檔案
> /home/monitor/hisdata/dir_his.dat
echo $SCANDATE' '$SCANTIME' || load dir_his.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明歷史資料入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load dir_his.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

#------入庫當次監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/dir.ctl data=/home/monitor/data/dir.dat log=/home/monitor/log/dir.log bad=/home/monitor/log/dir.bad

# 判斷當次監控資料入庫是否成功
if [ -e /home/monitor/log/dir.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/dir.log` != "0" ]
then
# 日誌存在但入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/dir.dat >> /home/monitor/hisdata/dir_his.dat
echo $SCANDATE' '$SCANTIME' || load dir.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
echo $SCANDATE' '$SCANTIME' || load dir.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/dir.dat >> /home/monitor/hisdata/dir_his.dat
echo $SCANDATE' '$SCANTIME' || load dir.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

# 周邊系統連通
elif [ $1 = "link" ]
then

#---------------------------- LINK ---------------------------------------------

# 刪除上次入庫生成的日誌檔案
rm /home/monitor/log/link.log
# 刪除上次歷史資料入庫生成的日誌檔案
rm /home/monitor/log/link_his.log

#------入庫歷史監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/link.ctl data=/home/monitor/hisdata/link_his.dat log=/home/monitor/log/link_his.log bad=/home/monitor/log/link_his.bad

# 判斷歷史資料是否入庫成功
if [ -e /home/monitor/log/link_his.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/link_his.log` != "0" ]
then
# 日誌存在但入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load link_his.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
# 歷史資料入庫成功,清空歷史資料檔案
> /home/monitor/hisdata/link_his.dat
echo $SCANDATE' '$SCANTIME' || load link_his.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明歷史資料入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load link_his.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

#------入庫當次監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/link.ctl data=/home/monitor/data/link.dat log=/home/monitor/log/link.log bad=/home/monitor/log/link.bad

# 判斷當次監控資料入庫是否成功
if [ -e /home/monitor/log/link.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/link.log` != "0" ]
then
# 日誌存在但入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/link.dat >> /home/monitor/hisdata/link_his.dat
echo $SCANDATE' '$SCANTIME' || load link.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
echo $SCANDATE' '$SCANTIME' || load link.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/link.dat >> /home/monitor/hisdata/link_his.dat
echo $SCANDATE' '$SCANTIME' || load link.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

# 關鍵程式
elif [ $1 = "process" ]
then

#---------------------------- PROCESS ---------------------------------------------

# 刪除上次入庫生成的日誌檔案
rm /home/monitor/log/process.log
# 刪除上次歷史資料入庫生成的日誌檔案
rm /home/monitor/log/process_his.log

#------入庫歷史監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/process.ctl data=/home/monitor/hisdata/process_his.dat log=/home/monitor/log/process_his.log bad=/home/monitor/log/process_his.bad

# 判斷歷史資料是否入庫成功
if [ -e /home/monitor/log/process_his.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/process_his.log` != "0" ]
then
# 日誌存在但入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load process_his.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
# 歷史資料入庫成功,清空歷史資料檔案
> /home/monitor/hisdata/process_his.dat
echo $SCANDATE' '$SCANTIME' || load process_his.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明歷史資料入庫失敗,等待下次入庫
echo $SCANDATE' '$SCANTIME' || load process_his.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

#------入庫當次監控資料
sqlldr userid=$ORA_USRID control=/home/monitor/bin/process.ctl data=/home/monitor/data/process.dat log=/home/monitor/log/process.log bad=/home/monitor/log/process.bad

# 判斷當次監控資料入庫是否成功
if [ -e /home/monitor/log/process.log ]
then
if [ `grep -i -c 'SQL*Loader-' /home/monitor/log/process.log` != "0" ]
then
# 日誌存在但入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/process.dat >> /home/monitor/hisdata/process_his.dat
echo $SCANDATE' '$SCANTIME' || load process.dat || failed . || ---- Cause : load database error .' >> /home/monitor/log/monitor.log
else
echo $SCANDATE' '$SCANTIME' || load process.dat || success .' >> /home/monitor/log/monitor.log
fi
else
# 日誌不存在則說明入庫失敗,儲存當次監控資料,等待下次入庫
cat /home/monitor/data/process.dat >> /home/monitor/hisdata/process_his.dat
echo $SCANDATE' '$SCANTIME' || load process.dat || failed . || ---- Cause : sqlldr error .' >> /home/monitor/log/monitor.log
fi

else

echo " --------------------------------------------------------&gt>> please enter : host or link or process!"

fi

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7490392/viewspace-1039639/,如需轉載,請註明出處,否則將追究法律責任。

相關文章