自动运行shell脚本

scpfile.sh

#scp复制指定文件到远程服务器指定目录,在远程主机上运行命令。

#!/bin/bash

#ipfile.txt是jar或war包与目标主机IP对应关系
#tmp.txt是临时存放jar或war包记录和日志
#scpfile.sh调用目标主机上的renamerun.sh,执行备份和运行操作
#scpfile.sh放置在cms的上传包所在文件夹,且cms与目标服务器已经实现免密登陆 


#源文件目录
dir1=/opt/tsingyun/basic_pkg
cd $dir1
#jar需要上传的文件目录
dir2=/opt/application/
#zip前端上传文件目录
dir3=root@192.168.9.102:/opt/application/

#jar文件行数
row=`ls -l *.jar | awk '{print $9}' | wc -l`

#如果jar存在,读取当前文件夹下*.jar文件名称
if [ "$row" -gt "0" ] ; then
    ls -l *.jar | awk '{print $9}' > tmp.txt
fi
# 单个文件进行复制操作
for ((i =1;i <= $row;i=i+1))
do
    #行读取tmp.txt文件
    onerow=`sed -n "$i"p < tmp.txt`
    #左截取
    leftonerow=${onerow#*tsingyun-}
    #右截取
    rightonerow=${leftonerow%%-*}

    #检索出文件名对应在服务器的IP
    ip=`more ipfile.txt | grep $rightonerow | sed 's/-.*$//g'`
    echo `date`+$rightonerow+$ip+"jar包与所在服务器IP" >> tmplog.txt
    #远程复制scp至目标服务器文件,再执行远程登陆,执行renamerun.sh
    scp $onerow "root@${ip}:${dir2}tsingyun-${rightonerow}" && ssh root@${ip} "cd ${dir2}tsingyun-${rightonerow}; ./renamerun.sh"
    echo `date`+$ip+"登陆远程主机,执行主机上的shell脚本" >> tmplog.txt
done

#war文件行数
row=`ls -l *.war | awk '{print $9}' | wc -l`

#如果.war存,在读取当前文件夹下*.war文件名称
if [ "$row" -gt "0" ] ; then
    ls -l *.war | awk '{print $9}' > tmp.txt
fi
# 单个文件进行复制操作
for ((i =1;i <= $row;i=i+1))
do
    #行读取tmp.txt文件
        onerow=`sed -n "$i"p < tmp.txt`
    #左截取
        leftonerow=${onerow#*tsingyun-}
    #右截取
        rightonerow=${leftonerow%%-*}
        #检索出文件名对应在服务器的IP
        ip=`more ipfile.txt | grep $rightonerow | sed 's/-.*$//g'`
        echo `date`+$rightonerow+$ip+"war包与所在服务器IP" >> tmplog.txt
        #远程复制scp至目标服务器文件,再执行登陆远程主机,运行renamerun.sh
        scp $onerow "root@${ip}:${dir2}tsingyun-${rightonerow}" && ssh root@${ip} "cd ${dir2}tsingyun-${rightonerow}; ./renamerun.sh" 
        echo `date`+$ip+"登陆远程主机,执行主机上的shell脚本" >> tmplog.txt
                                
done



#zip文件行数
row=`ls -l *.zip | awk '{print $9}' | wc -l`
#zip文件存在,执行复制操作
if [ "$row" -gt "0" ] ; then
    scp *.zip $dir3
    echo `date`+$row+"个zip文件进行copy" >> tmplog.txt
    #执行远程主机上的unzipbak.sh脚本
    ssh root@192.168.9.102 "cd /opt/application/; ./unzipbak.sh"
fi

exit 0

 renamerun.sh

#备份原文件,重新命名新文件,执行startup.sh

#!/bin/bash

#renamerun.sh需要放在jar|war包的当前目录下;
#renamerun.sh调用startup.sh
#renamerun.sh被cms上的scpfile.sh调用

#判断当前目录下是jar还是war,并按时间升序排列
ls -lrt *.jar > tmp.txt
#判断包类型
if [ $? == 0 ] ; then
    var=jar
else
    ls -lrt *.war > tmp.txt
    var=war
fi


#统计当前目录下的*.jar或.war行数
row=`more tmp.txt | wc -l`

#如果*.jar或.war行数大于等于2,执行rename
if [ "$row" -lt "2" ] ; then

    #当前目录下只用一个*.jara或.war包
    echo `date`+当前目录下只用一个"+$var+"包,不进行rename和运行>> tmp.txt
else
    #检索出需要重新命名的.jar或.war文件名
    renamefile=`sed -n 1p < tmp.txt | awk '{print $9}'`

    #jar或war重新命名
    mv $renamefile $renamefile.`date +"%Y%m%d"`

    #右截取,运行参数tsingyun-*
    rightrenamefile=${renamefile%-*}

    #新jar或war处理,打印新包名
    newjar=`ls -l *.$var | awk '{print $9}'`

    #截取左边字符串,确定是否需要重新命名
    leftnewjar=${newjar%%-*}
    if [ "${leftnewjar}" == "tsingyun" ] || [ "${leftnewjar}" == "TSINGYUN" ] ; then
        echo `date`+$var+"新包不需要重新命名" >> tmp.txt
    else
        #新jar或war包重新命名
        mv $newjar $rightrenamefile-${newjar##*-}
        echo `date`+`$var`+"新包重新命名成功" >> tmp.txt

    fi
    #运行新的jar或war包
    ./startup.sh $rightrenamefile
    echo `date`+$var+"运行新包成功" >> tmp.txt

fi

exit 0

 startup.sh

#! /bin/bash
project_name=$1
env=$2
source /etc/profile
base_dir=/opt/application/${project_name}
jar_path=`find $base_dir -name '*.jar' |grep -v 'sources'|grep ${base_dir}/${project_name}`
jps -l| grep -v Jps |grep ${base_dir}/${project_name} | awk -F " " '{print $1}'| xargs kill -9
nohup java  -jar -Xms8g -Xmx8g -Duser.timezone=GMT+8 -Dapollo.meta=http://192.168.9.100:8080 $jar_path >> $base_dir/tsingyun.log &

 

上一篇:Tomcat


下一篇:JAVA 打包 jar包和war包的区别