浏览 7805 次
锁定老帖子 主题:两个shell脚本,希望大家能够用上
精华帖 (0) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-08
最后修改:2011-09-20
第一个 定时抓取服务器JVM相关信息 #! /bin/sh #get_current_time export JAVA_HOME=/opt/jdk1.6.0_10/ export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH date=`date "+%Y-%m-%d-%H:%M:%S"` Root="/data/dxm/" jmapends=$Root$date"_jmap.txt" jstackends=$Root$date"_jstack.txt" jstateends=$Root$date"_jstate.txt" #start to register the jmap message echo "start to register the jmap to "$jmapends jmap -histo:live `jps|grep Resin |awk 'NR==1'|awk '{print $1}'` > $jmapends sleep 2 #start to register the jtack message echo "start to register the jstack to "$jstackends jstack -l `jps|grep Resin |awk 'NR==1'|awk '{print $1}'` > $jstackends sleep 2 #start to register the jstate message echo "start to register the jstate message to "$jstateends jstat -gcutil -t -h20 `jps|grep Resin |awk 'NR==1'|awk '{print $1}'` 1000 20 > $jstateends
这个可以跑个定时器: crontab -e */10 * * * * sh /timer/timer.sh #每十分钟抓一次
第二个脚本:对上面的脚本改进一下,只有系统负载达到指定的值之后才打印JVM信息
#! /bin/sh
function printJVMMessage() {
#get_current_time
export JAVA_HOME=/opt/jdk1.6.0_10/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
#only the system load greate than 1*8PU then start to print the gc details
date=`date "+%Y-%m-%d-%H:%M:%S"`
Root="/data/dxm/"
jmapends=$Root$date"_jmap.txt"
jstackends=$Root$date"_jstack.txt"
jstateends=$Root$date"_jstate.txt"
#start to register the jmap message
echo "start to register the jmap to "$jmapends
jmap -histo:live `jps|grep Resin |awk 'NR==1'|awk '{print $1}'` > $jmapends
sleep 2
#start to register the jtack message
echo "start to register the jstack to "$jstackends
jstack -l `jps|grep Resin |awk 'NR==1'|awk '{print $1}'` > $jstackends
sleep 2
#start to register the jstate message
echo "start to register the jstate message to "$jstateends
jstat -gcutil -t -h20 `jps|grep Resin |awk 'NR==1'|awk '{print $1}'` 1000 20 > $jstateends
}
#System Max Load Per CPU,when the SystemLoad reached the MAX_LOAD * CPU_NUMBER then start register the jvm message
MAX_LOAD=1
CPU_NUMBER=`cat /proc/cpuinfo | grep processor |wc -l`
TOTAL_LOAD_TO_WARN=$(($MAX_LOAD*$CPU_NUMBER))
#TOTAL_LOAD_TO_WARN=1
CURRENT_SYSTEM_LOAD=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
Start_Time=`date "+%Y-%m-%d-%H:%M:%S"`
echo 'start to print the jvm message...currenttime is:'$Start_Time
echo 'current system load is'$CURRENT_SYSTEM_LOAD' and TOTAO_LOAD_TO_WARN is '$TOTAL_LOAD_TO_WARN
if [ $(echo "$CURRENT_SYSTEM_LOAD > $TOTAL_LOAD_TO_WARN"|bc) == 1 ]; then
echo 'printint the jvm message...'
printJVMMessage
fi
Finish_Time=`date "+%Y-%m-%d-%H:%M:%S"`
echo 'finish to print the jvm message...and current time is:'$Finish_Time
第三个脚本:比较两个版本中jar包是否相同(有改变): #! /bin/sh #compare the lib files's md5 int file1 with those in file2 #if it only exist in file1 or one lib file's md5 is not equal i #with the other then print it to the log.txt LibPath1=$1 LibPath2=$2 date=`date "+%Y-%m-%d-%H:%M:%S"` LOG=$date"_log.txt" echo "-----------log file " $LOG echo LibPath1: $LibPath1 echo LibPath2: $LibPath2 echo LibPath1: $LibPath1 \n >> $LOG echo LibPath2: $LibPath2 \n >> $LOG echo >> $LOG echo >> $LOG for File in `ls -f $LibPath1|grep jar `; do MD5=`md5sum $1$File |awk 'NR==1'|awk '{print $1}'` File2=$LibPath2$File #echo "File2-----------------" $File2 #if the same lib file exist if [ ! -f "$File2" ]; then echo $File only exist LibPath1 echo $File only exist LibPath1 \n >> $LOG echo >> $LOG #if the same file exist in directory2 else MD52=`md5sum $File2 |awk 'NR==1'|awk '{print $1}'` if [ "$MD5" != "$MD52" ]; then echo the $File changed \n >> $LOG echo >> $LOG echo the $File changed fi fi done 上的那个文件为 md5compare.sh 运行是可以用以下命令运行: ./md5compare.sh libpath1 libpath2 注意libpath1,libpath2 必须以"/" 结尾比如: /opt/ROOT_2011-09-08-09:57:26/WEB-INF/lib/ 而不是 /opt/ROOT_2011-09-08-09:57:26/WEB-INF/lib]]]
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-09-19
不错,很好
|
|
返回顶楼 | |
发表时间:2011-09-20
jps|grep Resin |awk 'NR==1'|awk '{print $1} 万一服务器上有两个Resin进程呢? debian系统的话可以用/sbin/start-stop-daemon --pidfile 指定pid文件,来启动/停止resin |
|
返回顶楼 | |
发表时间:2011-09-23
最后修改:2011-09-24
md5sum $1/*.jar | sed -e "s/$1\///g" > /tmp/list1 md5sum $2/*.jar | sed -e "s/$2\///g" > /tmp/list2 diff /tmp/list1 /tmp/list2第三个也许可以这样写。 diff $1 $2 第二个,小改了下。 function printJVMMessage() { #get_current_time export JAVA_HOME=/opt/jdk1.6.0_10/ export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH #only the system load greate than 1*8PU then start to print the gc details date=`date +%F-%T` Root="/data/dxm/" jmapends=$Root$date"_jmap.txt" jstackends=$Root$date"_jstack.txt" jstateends=$Root$date"_jstate.txt" PID="`jps|grep Resin -m 1 | cut -d" " -f1`" #start to register the jmap message echo "start to register the jmap to "$jmapends jmap -histo:live `jps|grep Resin -m 1 | cut -d" " -f1` > $jmapends sleep 2 #start to register the jtack message echo "start to register the jstack to "$jstackends jstack -l $PID > $jstackends sleep 2 #start to register the jstate message echo "start to register the jstate message to "$jstateends jstat -gcutil -t -h20 $PID 1000 20 > $jstateends } #System Max Load Per CPU,when the SystemLoad reached the MAX_LOAD * CPU_NUMBER then start register the jvm message MAX_LOAD=1 CPU_NUMBER=`grep processor /proc/cpuinfo -c` TOTAL_LOAD_TO_WARN=$(($MAX_LOAD*$CPU_NUMBER)) #TOTAL_LOAD_TO_WARN=1 CURRENT_SYSTEM_LOAD=`uptime|awk -F [,:] '{print $8}'` Start_Time=`date "+%F-%T"` echo 'start to print the jvm message...currenttime is:'$Start_Time echo 'current system load is'$CURRENT_SYSTEM_LOAD' and TOTAO_LOAD_TO_WARN is '$TOTAL_LOAD_TO_WARN if [ $(echo "$CURRENT_SYSTEM_LOAD > $TOTAL_LOAD_TO_WARN"|bc) == 1 ]; then echo 'printint the jvm message...' printJVMMessage fi Finish_Time=`date +%F-%T` echo 'finish to print the jvm message...and current time is:'$Finish_Time |
|
返回顶楼 | |