相关文章推荐
鼻子大的领结  ·  责任到人措施到位确保安全 朱忠明实地检查进博会安保·  1 年前    · 
睿智的楼房  ·  2023年ISEF奖项公布,平和力压世外、华 ...·  1 年前    · 
潇洒的茴香  ·  独家|观致的变局与赌局:“野蛮人”入主9个月 ...·  2 年前    · 
非常酷的葡萄  ·  奇瑞新能源eQ7配置曝光 ...·  2 年前    · 
刀枪不入的核桃  ·  造物车工坊丨地表最强三缸车易主,恒大这波操作 ...·  2 年前    · 
Code  ›  Java 使用Runtime在一个Java程序中启动和关闭另一个Java程序开发者社区
string runtime
https://cloud.tencent.com/developer/article/1672317
精明的荔枝
2 年前
作者头像
heasy3
0 篇文章

Java 使用Runtime在一个Java程序中启动和关闭另一个Java程序

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 用户7614879的专栏 > Java 使用Runtime在一个Java程序中启动和关闭另一个Java程序

Java 使用Runtime在一个Java程序中启动和关闭另一个Java程序

作者头像
heasy3
发布 于 2020-08-02 12:50:24
1.5K 0
发布 于 2020-08-02 12:50:24
举报

主要使用了

Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});

调用shell命令的工具类:

    public static String runShell(String cmd) throws Exception {
        StringBuilder result = new StringBuilder();
        Process process = null;
        BufferedReader bufrIn = null;
        BufferedReader bufrError = null;
        try {
            // 执行命令, 返回一个子进程对象(命令在子进程中执行)使用这种方式可以使用|管道符命令
            process = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", cmd});
            // 方法阻塞, 等待命令执行完成(成功会返回0)
            process.waitFor();
            // 获取命令执行结果, 有两个结果: 正常的输出 和 错误的输出(PS: 子进程的输出就是主进程的输入)
            bufrIn = new BufferedReader(new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8));
            bufrError = new BufferedReader(new InputStreamReader(process.getErrorStream(), StandardCharsets.UTF_8));
            // 读取输出
            String line;
            while ((line = bufrIn.readLine()) != null) {
                result.append(line).append('\n');
            while ((line = bufrError.readLine()) != null) {
                result.append(line).append('\n');
        } finally {
            closeStream(bufrIn);
            closeStream(bufrError);
            // 销毁子进程
            if (process != null) {
                process.destroy();
        return result.toString();
    }

当有jar包上传到接口时,调用这个方法,停止正在运行的jar,并启动新jar

JAR_NAME校验自定,这里固定使用一个jar包名,方便jps时找到该进程

  /**
  *jar包上传及执行
 private ResponseVo myjarPkg(MultipartFile file) throws Exception {
        //myjar目录
        String myjarDir = "/data/myjar/";
        File fileDir = new File(myjarDir);
        fileDir.mkdirs();
        //文件名校验 名称不对则不执行
        if (!JAR_NAME.equals(file.getOriginalFilename())) {
            return new ResponseVo(-1, "不正确的文件");
        File myjarPkg = new File(myjarDir + file.getOriginalFilename());
        //将旧的已存在的删除
        if (myjarPkg.exists()) {
            FileUtils.deleteQuietly(myjarPkg);
        file.transferTo(myjarPkg);
        //运行myjar程序 先停掉之前的 再启动新上传的
        //由jre目录进入到父级jdk目录 不直接替换可以防止没有jre目录的情况
        String javaHome = System.getProperty("java.home").replace("/jre", "") + "/bin";
        final String java = javaHome + "/java";
        final String jps = javaHome + "/jps";
        String cmd = jps + " -l|grep " + JAR_NAME + "|awk '{print$1}'";
        String pid = ShellUtil.runShell(cmd);
        if (StringUtils.isNotBlank(pid)) {
            cmd = "kill -9 " + pid;
            String killmsg = ShellUtil.runShell(cmd);
            logger.info("kill process pid:{} ,result:{}", pid, killmsg);
            //杀掉之后等3s
            Thread.sleep(3000);
 
推荐文章
鼻子大的领结  ·  责任到人措施到位确保安全 朱忠明实地检查进博会安保
1 年前
睿智的楼房  ·  2023年ISEF奖项公布,平和力压世外、华二,连续三年勇夺一等奖!_中国国家队_上海_全球
1 年前
潇洒的茴香  ·  独家|观致的变局与赌局:“野蛮人”入主9个月后的醉翁之意_搜狐汽车_搜狐网
2 年前
非常酷的葡萄  ·  奇瑞新能源eQ7配置曝光 起售价或超10万元_搜狐汽车_搜狐网
2 年前
刀枪不入的核桃  ·  造物车工坊丨地表最强三缸车易主,恒大这波操作你打几分?_车家号_发现车生活_汽车之家
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号