• shell自动发布脚本


    由于本地web服务器上部署了多个应用,如果单个应用发布的情况下,以前的shell脚本不能满足自动化要求:

     [[  $1 == "api" ]]&&{
          des1=/opt/vhosts/open
          for m in 192.168.1.$3;do
          echo "sending file $2 to remote host:192.168.1.$m:$des1"
          scp -P 65422 src/$2 $m:/tmp
          echo  "stop tomcat service first ..."
         #####步骤:1,kill  java 进程,2,将原有war包进行更名,3,将传送过来的war包放入正确路径,4 将历史war包迁移备份至/opt/backup/,将 ROO
    T 目录移动至/tmp/目录 5 删除缓存,6 启动服务
          ssh -p 65422 -t $m<<UPDATE_API
          [ -d /opt/backup ]||{
          mkdir -p /opt/backup &&chown -R test:test /opt/backup/&&chmod 775 /opt/backup
         }
          pkill -9 java || echo  'kill process fail'
          mv  $des1/ROOT.war   /opt/backup/ROOT.war.`date +%Y%m%d-%T`||echo mv1 fail
          mv /tmp/$2  $des1/ROOT.war ||echo mv2 fail
          mv  /opt/vhosts/open/ROOT  /tmp/bak.ROOT.`date +%Y%m%d-%T`
          rm -rf /opt/apache-tomcat-6.0.35-open/work/Catalina ||echo clean cache fail
          source /etc/profile
          cd /opt/apache-tomcat-6.0.35-open/ && bin/startup.sh && echo $m update ok||echo `date`  $m update fail
    UPDATE_API
        done
    }

    如上所示,采用了pkill -9 java 把所有的java进程杀死了。

    进行脚本改造,增加判断:

    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4245850&pid=24568042&page=1&extra=page%3D1#pid24568042发现判断出来的进程id并不是远端服务的进程,还没找到原因~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    也许可以采用#ps aux|grep test | grep -v grep|awk '{print $2}' | xargs kill -9  来直接替代

    含泪废弃这种方式:

    采用 ssh -t $user@ip "cmd.sh"

    在本地服务器上创建脚本:
    #!/bin/bash

    #下载文件 本地保存路径
    localdir=/home/test/deploy/src/
    wget -c -N -T 10 ftp://$user:$password@deploy.test.tst/$2 -O $localdir$2||exit 1
    #远端备份目录
    backupdir=/opt/backup
    #远端程序存放目录
    package_tmp=/opt/package_tmp
    #test
    test=(238)
    #m
    m=192.168.16.
    case $1 in
      test)
        for ip in ${test[*]}
         do
          #echo $ip
          scp -P22 $localdir$2 $m$ip:$package_tmp
          ssh -p22 -t $m$ip "/usr/local/src/cmd.sh"
          done
        ;;
    esac

    应用服务器上脚本:

    #!/bin/bash

    backupdir=/opt/backup
    testdes=/opt/vhosts/test
    #默认程序包名
    package=ROOT.war
    #临时程序本地存储目录
    package_tmp=/opt/package_tmp
    #默认web程序包读取跟目录
    webpackage_dir=/opt/vhosts


    if [ ! -d $backupdir ]
            then
            mkdir -p $backupdir && chown -R winupon:winupon $backupdir && chmod 775 $backupdir
    fi

    if [ ! -d $package_tmp ]
            then
            mkdir -p $package_tmp && chown -R winupon:winupon $package_tmp && chmod 775 $package_tmp
    fi

    #获取package_tmp下最新的文件
    warname=`ls -t $package_tmp | awk '/war/{if(NR==1){print $filename}}'`
    echo "warname is:" $warname
    if [ -z $warname ]; then
            echo "Package does not exist,please check!!!"
            exit 0
    #else
    #       mv $warname
    fi

    #停服务
    testtomcatdir_list=$(ps aux|grep test | grep -v grep | awk '{print $12}'| sed -e 's/.*=(.*)/conf.*/1/g')
    echo "testtomcatdir_list---------------" $testtomcatdir_list
    if [ -z ${#testtomcatdir_list} ]; then
            echo "tomcat command is not running,please check!!!"
            exit 0
    fi


    testid_list=`ps aux|grep test | grep -v grep|awk '{print $2}'`
    for testpid in $testid_list;do
            echo "tomcat command is running, pid:"${testpid}
            kill -9 $testpid && echo kill1 OK || echo kill0 webtomcat fail
    done


    #备份
    echo "begin to backup war---------------------"

    mv  $testdes/$package $backupdir/$package.`date +%Y%m%d-%T` && echo backup OK || echo mv1 fail

    #放程序包到各个目录
    testdesdir_list=`ls /opt/vhosts/ | grep test`
    for testdesdir in $testdesdir_list; do
            rm -rf $webpackage_dir/$testdesdir/* && echo rm1 OK || echo  rm1 fail
            cp $package_tmp/$warname  $webpackage_dir/$testdesdir/$package && echo cp1 OK || echo cp1 fail
    done

    #清除缓存
    echo "begin to update tomcat------------------"$testtomcatdir_list
    for testtomcatdir in $testtomcatdir_list;do
            rm -rf $testtomcatdir/work/Catalina && echo clean cache ok || echo clean cache fail
            sleep 1
            set -m;sh $testtomcatdir/bin/startup.sh  && echo  update ok || echo update fail  =============》》为什么要加set -m ,如果不加,执行完这条命令,就退出了进程。结果服务也杀死了。
    done

    执行结果:

    Address 192.168.16.238 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
    docFactory_Web_exploded.war                                                                       100%   26MB  25.9MB/s   00:01    
    + ssh -p22 -t 192.168.16.238 /usr/local/src/cmd.sh
    Address 192.168.16.238 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
    warname is: docFactory_Web_exploded.war
    testtomcatdir_list--------------- /opt/apache-tomcat-6.0.35_test1 /opt/apache-tomcat-6.0.35_test
    tomcat command is running, pid:28761 begin to kill
    kill1 OK
    tomcat command is running, pid:28791 begin to kill
    kill1 OK
    begin to backup war---------------------
    backup OK
    rm1 OK
    cp1 OK
    rm1 OK
    cp1 OK
    begin to update tomcat------------------/opt/apache-tomcat-6.0.35_test1 /opt/apache-tomcat-6.0.35_test
    clean cache ok
    Using CATALINA_BASE:   /opt/apache-tomcat-6.0.35_test1
    Using CATALINA_HOME:   /opt/apache-tomcat-6.0.35_test1
    Using CATALINA_TMPDIR: /opt/apache-tomcat-6.0.35_test1/temp
    Using JRE_HOME:        /opt/jdk1.6.0_38/
    Using CLASSPATH:       /opt/apache-tomcat-6.0.35_test1/bin/bootstrap.jar
    update ok
    clean cache ok
    Using CATALINA_BASE:   /opt/apache-tomcat-6.0.35_test
    Using CATALINA_HOME:   /opt/apache-tomcat-6.0.35_test
    Using CATALINA_TMPDIR: /opt/apache-tomcat-6.0.35_test/temp
    Using JRE_HOME:        /opt/jdk1.6.0_38/
    Using CLASSPATH:       /opt/apache-tomcat-6.0.35_test/bin/bootstrap.jar
    update ok
    Connection to 192.168.16.238 closed.

  • 相关阅读:
    mysql 45讲 索引的使用 09-11
    mysql 45讲 相关锁的概念 06-08
    mysql 45讲 深入浅出索引04-05
    mysql 45讲 概览 01-03
    AQS源码解析第二回
    面试相关-怎么实现限流功能
    人工智能必备数学基础:线性代数基础(2)
    Elasticsearch问题总结和解决方法
    spring boot中打印所有日志
    Java中Stream流里面的findFirst()和findAny()区别
  • 原文地址:https://www.cnblogs.com/liangsky/p/5523999.html
Copyright © 2020-2023  润新知