- 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"> 调用 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();
- }
- }
来源: http://www.bubuko.com/infodetail-3358618.html