SpringBoot项目执行脚本 自动拉取最新代码并重启的实例内容
gitPullThenRestart.sh
#日期:20191230 #作者:何鹏举 #说明:项目部署在阿里云上,每次编译打包上传比较麻烦,因此编写此脚本,用于应用内可以点击按钮进行自动重启. #备注:1)阿里云的插件也是需要每次上传到OSS再启动,上传的jar包比较大(大部分是第三方依赖),感觉不好 #2)使用jenkins,就一个项目再去搭建一套jenkins,必要性也不是很大 #以下代码中/root/hekele为gitclone的项目路径,/root/app为部署的路径 #刷新环境变量 source~/.bashrc #切换到git项目目录拉取最新代码,并进行mvn的打包 cd/root/hekele gitpull cd/root/hekele/java mvncleaninstall #杀掉当前项目的进程 ps-ef|grephekele.jar|awk'{print$2}'|whilereadpid do kill-9$pid done #复制jar包,强制覆盖(忽略提醒),由于CentOS的.bashrc中打开cp的-i选项,即可使用-f也不行,所以还是先删除再复制 rm-f/root/app/hekele.jar cp/root/hekele/java/target/hekele.jar/root/app/ #后台启动项目 nohupjava-jar/root/app/hekele.jar>>/root/app/hekele.log2>&1& #查看日志(备注:kill掉之后,其复制jar包和启动还是执行了,原因暂时未知...此句话在手动启动可用,自动重启实测也没影响) tail-f/root/app/hekele.log
JavaController
@ApiOperation("拉取最新代码然后重启应用") @GetMapping("gitPullThenRestart") publicRgitPullThenRestart(){ //必须开启一个新线程,从而返回给浏览器,否则浏览器得不到响应,还会再次发送 newThread(()->ExecUtil.execCommand(restartShell)).start(); returnR.ok().setErrmsg("正在重新启动,请稍等"); }
JavaExecUtil
/** *执行系统命令 * * *
注意死锁问题 *
解决:只要主进程在waitfor之前,能不断处理缓冲区中的数据就可以 * *@see调用Process.waitfor导致的进程挂起 * *@authorhe_pe * */ @Slf4j publicclassExecUtil{ publicstaticvoidexecCommand(Stringcommand){ log.info("beginexecoscommand:"+command); Processprocess; try{ process=Runtime.getRuntime().exec(command); //开启新线程处理正常输出和错误输出 newThreadLogInputStream(process.getInputStream()); newThreadLogInputStream(process.getErrorStream()); //阻塞当前进程,直到命令结束 process.waitFor(); //不会阻塞进程,但是调用时如果没有完成会报错 if(process.exitValue()!=0){ log.error("execoscommandfailure:"+command); }else{ log.info("execoscommandsuccess:"+command); } }catch(Exceptione){ log.error(e.getMessage(),e); } } privatestaticvoidnewThreadLogInputStream(InputStreamis){ newThread(()->{ try(InputStreaminputStream=is; BufferedReaderbufr=newBufferedReader(newInputStreamReader(inputStream))){ Stringout=null; while((out=bufr.readLine())!=null){ log.info(out); } }catch(IOExceptione){ } }).start(); } }
以上就是本知识点的全部代码内容,感谢大家的学习和对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。