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