SpringBoot项目执行脚本 自动拉取最新代码并重启的实例内容

 更新时间:2019年12月31日 08:31:28   作者:何亦冷  
在本篇文章里小编给大家整理的是一篇关于SpringBoot项目执行脚本 自动拉取最新代码并重启的实例内容,有需要的朋友们参考下。

gitPullThenRestart.sh

# 日期: 20191230
# 作者: 何鹏举
# 说明: 项目部署在阿里云上, 每次编译打包上传比较麻烦, 因此编写此脚本, 用于应用内可以点击按钮进行自动重启.
# 备注: 1) 阿里云的插件也是需要每次上传到OSS再启动, 上传的jar包比较大(大部分是第三方依赖), 感觉不好
#    2) 使用jenkins, 就一个项目再去搭建一套jenkins, 必要性也不是很大

# 以下代码中 /root/hekele 为git clone的项目路径, /root/app 为部署的路径


# 刷新环境变量
source ~/.bashrc

# 切换到git项目目录拉取最新代码, 并进行mvn的打包
cd /root/hekele
git pull

cd /root/hekele/java
mvn clean install


# 杀掉当前项目的进程
ps -ef|grep hekele.jar | awk '{print $2}' | while read pid
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/

# 后台启动项目
nohup java -jar /root/app/hekele.jar >> /root/app/hekele.log 2>&1 &

# 查看日志(备注: kill掉之后, 其复制jar包和启动还是执行了, 原因暂时未知... 此句话在手动启动可用, 自动重启实测也没影响)
tail -f /root/app/hekele.log

JavaController

@ApiOperation("拉取最新代码然后重启应用")
  @GetMapping("gitPullThenRestart")
  public R gitPullThenRestart() {
    // 必须开启一个新线程, 从而返回给浏览器, 否则浏览器得不到响应, 还会再次发送
    new Thread(() -> ExecUtil.execCommand(restartShell)).start();
    return R.ok().setErrmsg("正在重新启动, 请稍等");
  }

JavaExecUtil

/**
 * 执行系统命令
 * 
 * 
 * <br> 注意死锁问题
 * <br> 解决: 只要主进程在waitfor之前,能不断处理缓冲区中的数据就可以
 * 
 * @see <a href="https://blog.csdn.net/seapeak007/article/details/69668600" rel="external nofollow" >调用Process.waitfor导致的进程挂起</a>
 * 
 * @author he_pe
 *
 */
@Slf4j
public class ExecUtil {

  public static void execCommand(String command) {
    log.info("begin exec os command: " + command);
    Process process;
    try {
      process = Runtime.getRuntime().exec(command);
      
      //开启新线程处理正常输出 和 错误输出
      newThreadLogInputStream(process.getInputStream());
      newThreadLogInputStream(process.getErrorStream());

      // 阻塞当前进程,直到命令结束
      process.waitFor();

      // 不会阻塞进程,但是调用时如果没有完成会报错
      if (process.exitValue() != 0) {
        log.error("exec os command failure: " + command);
      } else {
        log.info("exec os command success: " + command);
      }
    } catch (Exception e) {
      log.error(e.getMessage(), e);
    }
  }

  private static void newThreadLogInputStream(InputStream is){
    new Thread(() -> {
      try(InputStream inputStream = is;
        BufferedReader bufr = new BufferedReader(new InputStreamReader(inputStream))){
        String out = null;
        while ((out = bufr.readLine()) != null) {
          log.info(out);
        }
      } catch (IOException e) {
      }
    }).start();
  }

}

以上就是本知识点的全部代码内容,感谢大家的学习和对脚本之家的支持。

相关文章

  • Mybatis分页的4种方式实例

    Mybatis分页的4种方式实例

    这篇文章主要介绍了Mybatis分页的4种方式实例,包括数组分页,sql分页,拦截器分页,RowBounds分页,需要的朋友可以参考下
    2022-04-04
  • mybatis学习之路mysql批量新增数据的方法

    mybatis学习之路mysql批量新增数据的方法

    这篇文章主要介绍了mybatis学习之路mysql批量新增数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • 详解Spring依赖注入的三种方式使用及优缺点

    详解Spring依赖注入的三种方式使用及优缺点

    这篇文章主要介绍了spring依赖注入的三种方式的使用方法,以及优缺点的介绍,通过代码示例介绍的非常详细,感兴趣的小伙伴可以参考一下
    2023-04-04
  • Spring data jpa @Query update的坑及解决

    Spring data jpa @Query update的坑及解决

    这篇文章主要介绍了Spring data jpa @Query update的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 浅析springboot通过面向接口编程对控制反转IOC的理解

    浅析springboot通过面向接口编程对控制反转IOC的理解

    这篇文章主要介绍了springboot通过面向接口编程对控制反转IOC的理解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-08-08
  • Jmeter非GUI模式运行分布式测试

    Jmeter非GUI模式运行分布式测试

    这篇文章主要介绍了Jmeter非GUI模式运行分布式测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot超详细讲解Thymeleaf模板引擎

    SpringBoot超详细讲解Thymeleaf模板引擎

    这篇文章主要分享了Spring Boot整合使用Thymeleaf,Thymeleaf是新一代的Java模板引擎,类似于Velocity、FreeMarker等传统引擎,关于其更多相关内容,需要的小伙伴可以参考一下
    2022-07-07
  • springboot项目接入第三方qq邮箱验证登录的全过程

    springboot项目接入第三方qq邮箱验证登录的全过程

    互联网发展到现在,相必大家都知道发送邮件应该是网站的必备功能之一,下面这篇文章主要给大家介绍了关于springboot项目接入第三方qq邮箱验证登录的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 浅谈JVM垃圾回收有哪些常用算法

    浅谈JVM垃圾回收有哪些常用算法

    今天给大家带来的是关于Java虚拟机的相关知识,文章围绕着JVM垃圾回收有哪些常用算法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Dubbo+zookeeper搭配分布式服务的过程详解

    Dubbo+zookeeper搭配分布式服务的过程详解

    Dubbo作为分布式架构比较后的框架,同时也是比较容易入手的框架,适合作为分布式的入手框架,下面是简单的搭建过程,对Dubbo+zookeeper分布式服务搭建过程感兴趣的朋友一起看看吧
    2022-04-04

最新评论