• 常用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 前的目录下去

  • 相关阅读:
    Valgrind使用转载 Sanny.Liu
    Caffe模型读取 Sanny.Liu
    JNI动态库生成、编译、查看相关简易资料 Sanny.Liu
    GDB调试,转载一位大牛的东西 Sanny.Liu
    Android处理图片工具(转载) Sanny.Liu
    添加可点击的imagebottom,有个点击动画效果 Sanny.Liu
    去OpenCVManager,大部分为转载,仅当自己学习使用 Sanny.Liu
    转载: vim使用技巧 Sanny.Liu
    结构体数组初始化三种方法,转载 Sanny.Liu
    AsyncTask机制学习 Sanny.Liu
  • 原文地址:https://www.cnblogs.com/rainy-shurun/p/5090673.html
Copyright © 2020-2023  润新知