常用shell命令实战

#!/bin/sh


###################
####  环境变量  ###
###################

#主程序目录
#APP_HOME=/apps/svr/apache-tomcat-7.0.2/webapps
APP_HOME=/apps/svr/tomcat/webapps

#要解析的文件目录
APP_JENKINS_HOME=/apps/$(date +%Y%m%d)
APP_ROOT=XX
APP_NAME_01=XXX_01
APP_NAME_02=XXX_01
APP_NAME_03=XXX_01

#创建临时文件夹,用来存放解压后的文件
mkdir -p /tmp/$APP_ROOT

#需要替换的内容(old/new----原/新)
#old_value_1=10.101.0.20
#new_value_1=192.168.52.20

#old_value_2=127.0.0.1
#new_value_2=192.168.52.20

#old_value_3=classpath:
#new_value_3=file:\/apps\/javaconf\/common\/

#---------------------------------------------------------------------------------


#执行shell脚本log文件输出目录
#APP_LOG=/home/shell_log/filesMonitor.log

#首先将jenkins生成的war包全部复制到APP_JENKINS_HOME目录下
#若今天之前已经生成过war包时,备份这些war包
ls -l $APP_JENKINS_HOME/*.war 1>/dev/null 2>/dev/null
if [ $? = 0 ]
then
    mkdir -p $APP_JENKINS_HOME.bak
    cp -f $APP_JENKINS_HOME/*.war $APP_JENKINS_HOME.bak/
fi

mkdir $APP_JENKINS_HOME
#cp /apps/svr/jenkins/workspace/test_BM2.0/bm-web/target/*.war /apps/$(date +%Y%m%d)
cp /apps/svr/jenkins/workspace/test_$APP_ROOT/$APP_NAME_01/target/$APP_NAME_01.war /apps/$(date +%Y%m%d)
cp /apps/svr/jenkins/workspace/test_$APP_ROOT/$APP_NAME_02/target/$APP_NAME_02.war /apps/$(date +%Y%m%d)
cp /apps/svr/jenkins/workspace/test_$APP_ROOT/$APP_NAME_03/target/$APP_NAME_03.war /apps/$(date +%Y%m%d)

##########################################
### 循环遍历文件,并且修改里面的内容######
##########################################
  for file in `ls ${APP_JENKINS_HOME}/*.war`
    do
        echo "------------------ begin ------------------------"
        echo "开始遍历文件[$file]... "  
        if [ -f $file ]; then
        #解压文件
        echo "[$(date +'%F %H:%M:%S')]准备解压文件 $file  unzip -oq ..."
        unzip -oq $file -d /tmp/$APP_ROOT 
          if [ $? -eq 0 ]; then  
             echo "[Success]"  
             echo "[$(date +'%F %H:%M:%S')]解压文件成功!准备执行下一指令 sed -i..."
          else  
            echo "解压文件[Failed]"  
            break;
          fi 
        #修改文件
        echo "[$(date +'%F %H:%M:%S')]开始替换文件里面的内容."      
        #数据源
    if [[ $file == *$APP_NAME_01* ]]; then
            sed -i 's/classpath:/file:\/apps\/javaconf\/$APP_NAME_01\//g' /tmp/$APP_ROOT/WEB-INF/classes/spring/application-hibernate.xml
        sed -i 's/file:\/apps\/javaconf\/common\//file:\/apps\/javaconf\/$APP_NAME_01\//g' /tmp/$APP_ROOT/WEB-INF/classes/spring/application-hibernate.xml
     elif [[ $file == *$APP_NAME_02* ]]; then
        sed -i 's/classpath:/file:\/apps\/javaconf\/$APP_NAME_02\//g' /tmp/$APP_ROOT/WEB-INF/classes/spring/application-hibernate.xml
        sed -i 's/file:\/apps\/javaconf\/common\//file:\/apps\/javaconf\/$APP_NAME_02\//g' /tmp/$APP_ROOT/WEB-INF/classes/spring/application-hibernate.xml
    elif [[ $file == *$APP_NAME_03* ]]; then
        sed -i 's/classpath:/file:\/apps\/javaconf\/$APP_NAME_03\//g' /tmp/$APP_ROOT/WEB-INF/classes/spring/application-hibernate.xml
        sed -i 's/file:\/apps\/javaconf\/common\//file:\/apps\/javaconf\/$APP_NAME_03\//g' /tmp/$APP_ROOT/WEB-INF/classes/spring/application-hibernate.xml
    fi
        #重新打包,并复制到原目录,替换以前的war包
        cd /tmp/$APP_ROOT/
        jar -cvfM0 $file ./
           if [ $? -eq 0 ]; then
              echo "[$(date +'%F %H:%M:%S')]文件[$file]重新压缩成功,准备执行下一指令 rm -rf..."
           else          
              echo "压缩文件[$file][Failed]"
           fi 
        #清理临时文件,为解压下一个文件准备
        rm -rf /tmp/$APP_ROOT/*
        echo "$file ....OK" 
       fi
      echo "------------------- end -------------------------" 
   done


#copyFiles()-->复制文件到tomcat/webapps目录
#步骤: 1)删除webapps下面的主程序文件,包含已解压的文件和war包
#      2)将jenkins下的文件cpoy到webapps下,这里使用 '\cp'指令处理不提示覆盖
#        因为在Linux下默认cp命令是有别名(alias cp='cp -i')的,无法强制覆盖,
#        即使你用 -f 参数也无法强制覆盖文件,还是会有系统提示是否覆盖。
#
#
#
#----------------------------------------------------------------------------

  echo "------------------ begin ----------------------------"
  #切换到主目录
  echo "[info][$(date +'%F %H:%M:%S')] 切换到主目录$APP_HOME"
  cd $APP_HOME
  #删除tomcat下主程序文件
  echo "[info][$(date +'%F %H:%M:%S')] 删除主目录$APP_HOME下以'$APP_NAME_01'开头的文件"
  rm -rf $APP_NAME_01*
  rm -rf $APP_NAME_02*
  rm -rf $APP_NAME_03*
  #切换到jenkins主目录
  echo "[info][$(date +'%F %H:%M:%S')] 切换到主目录$APP_JENKINS_HOME"
  cd $APP_JENKINS_HOME
  #复制文件到主目录
  echo "[info][$(date +'%F %H:%M:%S')] 复制文件到主目录$APP_HOME"
  cp $APP_NAME_01*.war $APP_HOME
  cp $APP_NAME_02*.war $APP_HOME
  cp $APP_NAME_03*.war $APP_HOME
  echo "------------------- end --------------------------"

 

 

#tomcat关闭应用

#!/bin/sh
#Date:2013/12/30
#
#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,
#也可以作为启动java程序的独立脚本来使用。

#注意:  
#1)直接在Linux/UNIX上面创建并编写shell脚本  
#  这是因为Windows下编写的*.sh文档格式和编码,是Linux/UNIX所不能完全承认的  
#  最直接的体现就是使用过程中会遇到很多似是而非的错误,这曾经搞疯了一大片人  
#2)编写完*.sh之后,记得[chmod 755 *.sh],否则会提示无法执行or没有权限执行等.

#警告:
#该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。
#在杀死进程前,未作任何条件检查。在某些情况下,如程序正在进行文件或数据库写操作,
#可能会造成数据丢失或数据不完整。如果必须要考虑到这类情况,则需要改写此脚本,
#增加在执行kill命令前的一系列检查。

###################################################
#环境变量及程序执行参数                        ####
#需要根据实际环境以及Java程序名称来修改这些参数####
###################################################

#JDK所在路径
#JAVA_HOME="/apps/svr/jdk1.6.0_26"

#JVM启动参数  
#-server:一定要作为第一个参数,在多个CPU时性能佳  
#-Xloggc:记录GC日志,这里建议写成绝对路径,如此便可在任意目录下执行该shell脚本  
#JAVA_OPTS="-Duser.timezone=GMT+8 -server -ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"  

#Tomcat目录
#APP_TOMCAT=/apps/svr/apache-tomcat-7.0.2
APP_TOMCAT=/apps/svr/tomcat

#Tomcat主程序目录
APP_HOME=$APP_TOMCAT/webapps/

#Tomcat缓存目录
Tomcat_Cache=$APP_TOMCAT/work

#Shell执行输出日志
APP_LOG=/home/shell_log/tomcatMonitor.log

########################################################################################
#函数 初始化pid(全局)  
#getTradeProtalPID()-->获取Java应用的PID  
#说明:通过JDK自带的JPS命令及grep命令,准确查找Java应用的PID  
#其中:[jps -l]表示显示Java主程序的完整包路径  
#awk命令可以分割出PID($1部分)及Java主程序名称($2部分)  
#例子:[$JAVA_HOME/bin/jps -l | grep $APP_MAIN]-->>[5775 com.cucpay.tradeportal.MainApp]  
#另外:用这个命令也可以直接取到程序的PID-->>[ps aux|grep java|grep $APP_MAIN|grep -v grep|awk '{print $2}']  
#-------------------------------------------------------------------------------------------------------------  
#初始化全局变量tradePortalPID,用于标识交易前置系统的PID,0表示未启动  
tradePortalPID=0  

getTradeProtalPID(){
    echo "[$(date +'%F %H:%M:%S')] 正在获取tomcat服务的PID..."
    javaps=$(ps -ef |grep tomcat |grep -w 'apps/svr\/tomcat\/conf'|grep -v 'grep'|awk '{print $2}')
    echo "[$(date +'%F %H:%M:%S')] Tomcat服务的(PID=$javaps)"
    if [ -n "$javaps" ]; then
        #赋值
        tradePortalPID=$javaps
        echo "[$(date +'%F %H:%M:%S')](PID=$tradePortalPID)"
    else
        tradePortalPID=0
    fi
}  


#-------------------------------------------------------------------------------------------------------------  
#shutdown()-->停止Java应用程序  
#步骤:1)调用getTradeProtalPID()函数,刷新$tradePortalPID全局变量  
#     2)若程序已经启动($tradePortalPID不等于0),则开始执行停止程序操作,否则提示程序未运行  
#     3)使用[kill -9 PID]命令强制杀掉进程  
#     4)使用[$?]获取上一句命令的返回值,若其为0,表示程序已停止运行,则打印[Success],反之则打印[Failed]  
#     5)为防止Java程序被启动多次,这里增加了反复检查程序进程的功能,通过递归调用shutdown()函数的方式,反复kill  
#注意:Shell编程中,[$?]表示上一句命令或者上一个函数的返回值  
#-------------------------------------------------------------------------------------------------------------  
    getTradeProtalPID  
    echo "----------------------------- begin -----------------------------------------"
    echo "[info]-[$(date +'%F %H:%M:%S')] Stopping tomcat..."  
    if [ $tradePortalPID -ne 0 ]; then  
        echo -n "Stopping PID=$tradePortalPID"  
        kill -9 $tradePortalPID         
        echo "[kill 掉进程: $tradePortalPID]"
        if [ $? -eq 0 ]; then  
            echo "[info]-[$(date +'%F %H:%M:%S')]-->[Success]"  
        else  
            echo "[info]-[$(date +'%F %H:%M:%S')]-->[Failed]"        
        fi
        sleep 3
        #清除缓存
        rm -rf $Tomcat_Cache        
        getTradeProtalPID  
        if [ $tradePortalPID -ne 0 ]; then  
            shutdown  
        fi  
    else  
        echo "[info]-[$(date +'%F %H:%M:%S')] Tomcat is not running"  
    fi  
    echo "----------------------------- end  -----------------------------------------"

#输出日志
#getTradeProtalPID>>$APP_LOG
  

 

#tomcat启动

#!/bin/sh
#Date:2013/12/30
#
#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用,
#也可以作为启动java程序的独立脚本来使用。

#注意: 
#1)直接在Linux/UNIX上面创建并编写shell脚本 
# 这是因为Windows下编写的*.sh文档格式和编码,是Linux/UNIX所不能完全承认的 
# 最直接的体现就是使用过程中会遇到很多似是而非的错误,这曾经搞疯了一大片人 
#2)编写完*.sh之后,记得[chmod 755 *.sh],否则会提示无法执行or没有权限执行等.

###################################################
### 环境变量及程序执行参数 ####
#需要根据实际环境以及Java程序名称来修改这些参数####
###################################################

#JDK所在路径
#JAVA_HOME="/apps/svr/jdk1.6.0_26"

#JVM启动参数 
#-server:一定要作为第一个参数,在多个CPU时性能佳 
#-Xloggc:记录GC日志,这里建议写成绝对路径,如此便可在任意目录下执行该shell脚本 
#JAVA_OPTS="-Duser.timezone=GMT+8 -server -ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"

#tomcat名称
#APP_TOMCAT_NAME=apache-tomcat-7.0.2
APP_TOMCAT_NAME=tomcat
#Tomcat目录
APP_TOMCAT=/apps/svr/$APP_TOMCAT_NAME

#Tomcat主程序目录
APP_HOME=$APP_TOMCAT/webapps/

#Tomcat启动
Tomcat_Start=$APP_TOMCAT/bin/startup.sh

#Tomcat缓存目录
Tomcat_Cache=$APP_TOMCAT/work/


#Shell执行输出日志
APP_LOG=/home/shell_log/tomcatMonitor.log

########################################################################################
#函数 初始化pid(全局) 
#getTradeProtalPID()-->获取Java应用的PID 
#说明:通过JDK自带的JPS命令及grep命令,准确查找Java应用的PID 
#其中:[jps -l]表示显示Java主程序的完整包路径 
#awk命令可以分割出PID($1部分)及Java主程序名称($2部分) 
#例子:[$JAVA_HOME/bin/jps -l | grep $APP_MAIN]-->>[5775 com.cucpay.tradeportal.MainApp] 
#另外:用这个命令也可以直接取到程序的PID-->>[ps aux|grep java|grep $APP_MAIN|grep -v grep|awk '{print $2}'] 
#------------------------------------------------------------------------------------------------------------- 
#初始化全局变量tradePortalPID,用于标识交易前置系统的PID,0表示未启动 
tradePortalPID=0 

getTradeProtalPID(){ 
echo "[$(date +'%F %H:%M:%S')] 正在获取tomcat服务的PID..."
javaps=$(ps -ef |grep tomcat |grep -w 'apps/svr\/tomcat\/conf'|grep -v 'grep'|awk '{print $2}') 
echo "[$(date +'%F %H:%M:%S')] Tomcat服务的(PID=$javaps)"
if [ -n "$javaps" ]; then 
#tradePortalPID='echo $javaps | awk '{print $2}''
tradePortalPID=$javaps
echo "[$(date +'%F %H:%M:%S')](PID=$tradePortalPID)" 
else 
tradePortalPID=0 
fi 
}


#------------------------------------------------------------------------------------------------------------- 
#startup()-->启动Java应用程序 
#步骤:1)调用getTradeProtalPID()函数,刷新$tradePortalPID全局变量 
# 2)若程序已经启动($tradePortalPID不等于0),则提示程序已启动 
# 3)若程序未被启动,则执行启动命令 
# 4)启动命令执行后,再次调用getTradeProtalPID()函数 
# 5)若步骤4执行后,程序的PID不等于0,则打印[Success],否则打印[Failed] 
#注意:[echo -n]表示打印字符后,不换行 

echo "--------------------------- begin -----------------------------"
getTradeProtalPID 
#如果PID不等于0 
if [ $tradePortalPID -ne 0 ]; then 
echo "[$(date +'%F %H:%M:%S')] Tomcat is not running" 
else 
echo -n "Starting tomcat..." 
#启动Tomcat
source /etc/profile
$Tomcat_Start
sleep 10 
echo "--------------------------------------------------------"
getTradeProtalPID
if [ $tradePortalPID -ne 0 ]; then
echo "[$(date +'%F %H:%M:%S')](PID=$tradePortalPID)...[Success]" 
else 
echo "[$(date +'%F %H:%M:%S')][Failed]" 
fi
echo "------------------------ end --------------------------------" 
fi 

#日志输出
#startup>>$APP_LOG

 

#判断前一条shell命令是否成功

if [[ $? != 0 ]]; then 

cd /

else 

cd /boot

fi

$? 表示上一条shell命令是否成功,如果成功$? 等于 0, 如果不成功, $? 不等于 0 

 

记录:

在linux中使用时,可能会出现cd 目录,但是,过去之后想快速返回之前的目录下去,可以使用cd - 这样的方式进行快速返回到cd 前的目录下去

posted on 2015-12-31 09:21  舒润  阅读(541)  评论(0编辑  收藏  举报

导航