自动运行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 &

浙公网安备 33010602011771号