论坛首页 综合技术论坛

两个shell脚本,希望大家能够用上

浏览 7805 次
精华帖 (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]]]






 

   发表时间:2011-09-19  
不错,很好
0 请登录后投票
   发表时间:2011-09-20  
jps|grep Resin |awk 'NR==1'|awk '{print $1}


万一服务器上有两个Resin进程呢?

debian系统的话可以用/sbin/start-stop-daemon --pidfile 指定pid文件,来启动/停止resin



0 请登录后投票
   发表时间: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  
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics