#!/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 前的目录下去