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();
  }

}

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

(0)

相关推荐

  • Linux编辑启动、停止与重启springboot jar包脚本实例

    前言 springboot的配置文件中,配置文件的名字都有各自的意义跟用途 dev 开发环境 prod 生产环境(默认) test 测试环境 加载指定配置文件 --spring.profiles.active=prod springboot加载jar包的方式有 // 直接在控制台进行启动,缺点就是控制台关闭项目也就关闭了. java -jar bootdo.jar // 这种方式可以运行在后台,但是如果推出了shell的话,那也会挂 java -jar /bootdo-2.0.0.jar > b

  • springboot自动重启的简单方法

    1. 必须重启 目前的Springboot,当发生了任何修改之后,必须关闭后再启动Application类才能够生效,显得略微麻烦. Springboot提供了热部署的方式,当发现任何类发生了改变,马上通过JVM类加载的方式,加载最新的类到虚拟机中. 这样就不需要重新启动也能看到修改后的效果了 2. pom.xml 做法很简单,在pom.xml中新增加一个依赖就行了 <dependency> <groupId>org.springframework.boot</groupId

  • SpringBoot热重启配置详解

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> 不能被其它模块继承,如果多个子模块可以去掉 不必须 <scope>runtime</scope> 只在运行时起作用 打包时不打进去

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

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

  • 解决Springboot项目启动后自动创建多表关联的数据库与表的方案

    熬夜写完,尚有不足,但仍在努力学习与总结中,而您的点赞与关注,是对我最大的鼓励! 在一些本地化项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据库表,如mybatis plus.spring JPA等,但您是否有想过,若要自行构建一套更为复杂的表结构时,这种开源框架是否也能满足呢,若满足不了话,又该如何才能实现呢? 我在前面写过一篇 Activiti工作流学习笔记(

  • 写一个Python脚本自动爬取Bilibili小视频

    我身边的很多小伙伴们在朋友圈里面晒着出去游玩的照片,简直了,人多的不要不要的,长城被堵到水泄不通,老实人想想啊,既然人这么多,哪都不去也是件好事,没事还可以刷刷 B 站 23333 .这时候老实人也有了一个大胆地想法,能不能让这些在旅游景点排队的小伙伴们更快地打发时间呢?考虑到视频的娱乐性和大众观看量,我决定对 B 站新推出的小视频功能下手,于是我跑到B站去找API接口,果不起然,B站在小视频功能处提供了 API 接口,小伙伴们有福了哟! B 站小视频网址在这里哦: http://vc.bili

  • SpringBoot 配合 SpringSecurity 实现自动登录功能的代码

    自动登录是我们在软件开发时一个非常常见的功能,例如我们登录 QQ 邮箱: 很多网站我们在登录的时候都会看到类似的选项,毕竟总让用户输入用户名密码是一件很麻烦的事. 自动登录功能就是,用户在登录成功后,在某一段时间内,如果用户关闭了浏览器并重新打开,或者服务器重启了,都不需要用户重新登录了,用户依然可以直接访问接口数据 作为一个常见的功能,我们的 Spring Security 肯定也提供了相应的支持,本文我们就来看下 Spring Security 中如何实现这个功能. 一.加入 remembe

  • SpringBoot项目中接口防刷的完整代码

    一.自定义注解 import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @author Yang * @version 1.0 * @date 2021/2/22

  • SpringBoot实现JWT token自动续期的示例代码

    为什么要 token自动续期 token中一般会包含用户的基本信息,为了保证token的安全性,一般会将token的过期时间设置的比较短,但是这样会导致用户因为token过期需要频繁登录,因此需要token自动续期. //创建token String token = JwtUtil.createToken(sysUser.getId(), user.getUserName()); //将token放入redis中,key为用户的手机号+"token" redisUtil.set(sys

  • SpringBoot项目如何访问jsp页面的示例代码

    最近在接支付项目,从官方下了个及时到款的demo,想在springBoot项目中运行起来,发现访问jsp的时候直接会访问到jsp页面的源文件. 如何在springBoot项目中访问到jsp页面? 1.添加pom依赖 首先在原来的pom文件基础上加上这两个配置 <!-- tomcat 的支持.--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring

  • Jenkins+Docker 一键自动化部署 SpringBoot 项目的详细步骤

    目录 Jenkins+Docker 一键自动化部署 SpringBoot 项目 一.安装docker 1.确保 yum 包更新到最新 2.卸载旧版本(如果安装过旧版本的话) 3.安装需要的软件包 4.设置yum源 5.安装docker 6.启动和开机启动 7.验证安装是否成功 二.安装Jenkins 1.安装Jenkins 2.初始化Jenkins 2.1 解锁Jenkins 2.2 安装插件 2.3 创建管理员用户 三.系统配置 1. 安装需要插件 2. 配置Maven 四.创建任务 1. 新

  • Linux脚本自动打包发服务

    适用于前后台分离的服务 一个jar包 一个前台工程 实现自动杀端口,复制文件,备份数据,发布新版本. 脚本复制到Linux中 [./jb.sh]按Enter运行即可 内容如下: #自定义存放的地方 #文件存放的根目录 latestDir=/home/xnj #jar包名字 jarName=swWeb.jar #前端压缩包文件名 qdZipName=Desktop.zip #前端tomcat的位置 qdTomcatPosition=/home/tomcat/apache-tomcat-8.5.43

  • Docker快速部署SpringBoot项目介绍

    1.安装 Docker 首先打开linux环境,输入以下命令进行安装: 安装 yum install docker 检查是否安装成功 docker --version #启动 systemctl start docker 如果下载很慢,可以切换到国内的阿里云镜像,进行下载: 换镜像源 sudo vim /etc/docker/daemon.json 内容如下: { "registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.c

随机推荐