iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java Runtime的使用详解
  • 512
分享到

Java Runtime的使用详解

2024-04-02 19:04:59 512人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言1. shutdownhook2. exec执行2.1 常规命令执行2.2 管道符2.3源码分析3. 总结前言 最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分

前言

最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分框架运行lock文件,这里就想到了shutdownhook,顺便学了学Runtime的使用

1. shutdownhook

demo示例,证明在程序正常结束的时候会调用,如果kill -9 那肯定就不会调用了


public class ShutdownHookTest { 
    public static void main(String[] args) {
        System.out.println("==============application start================");
 
        Runtime.getRuntime().addShutdownHook(new Thread(()->{
            System.out.println("--------------hook 1----------------");
        }));
        Runtime.getRuntime().addShutdownHook(new Thread(()->{
            System.out.println("--------------hook 2----------------");
        }));
 
        System.out.println("==============application end================");
    }
}

正常运行结束,结果如下

==============application start================
==============application end================
--------------hook 1----------------
--------------hook 2----------------

Process finished with exit code 0

如果暂停,点击下图左下角的正方形红图标,停止正在运行的应用

结果如下,shutdownhook已执行。

shutdownhook可以处理程序正常结束的时候,删除文件,关闭连接等

2. exec执行

2.1 常规命令执行

demo示例如下,比如ls


public class ShutdownHookTest { 
    public static void main(String[] args) throws InterruptedException, IOException {
        Process process = Runtime.getRuntime().exec("ls"); 
        try (InputStream fis = process.getInputStream();
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader br = new BufferedReader(isr)) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
}

结果如下

而正常执行结果

但是这个方法有远程执行风险,即在浏览器端通过这个方法执行特定指令,比如执行rm -rf *,结果就很……

2.2 管道符

但是遇见管道符之后就会失效,什么办法解决,sh -c,但是不能直接用,否则获取到的是TTY窗口信息


    public static void main(String[] args) throws IOException {
        Process process = Runtime.getRuntime().exec("sh -c ps aux|grep java"); 
        try (InputStream fis = process.getInputStream();
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader br = new BufferedReader(isr)) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }

结果?

sh -c的参数要分离,不然runtime会认为是一个参数

2.3源码分析

跟踪代码,使用ProcessImpl来执行指令


    public Process exec(String[] cmdarray, String[] envp, File dir)
        throws IOException {
        return new ProcessBuilder(cmdarray)
            .environment(envp)
            .directory(dir)
            .start();
    }

ProcessBuilder


// Only for use by ProcessBuilder.start()
    static Process start(String[] cmdarray,
                         java.util.Map<String,String> environment,
                         String dir,
                         ProcessBuilder.Redirect[] redirects,
                         boolean redirectErrorStream)
        throws IOException
    {
        assert cmdarray != null && cmdarray.length > 0;
 
        // Convert arguments to a contiguous block; it's easier to do
        // memory management in Java than in C.
        byte[][] args = new byte[cmdarray.length-1][];
        int size = args.length; // For added NUL bytes
        for (int i = 0; i < args.length; i++) {
            args[i] = cmdarray[i+1].getBytes();
            size += args[i].length;
        }
        byte[] argBlock = new byte[size];
        int i = 0;
        for (byte[] arg : args) {
            System.arraycopy(arg, 0, argBlock, i, arg.length);
            i += arg.length + 1;
            // No need to write NUL bytes explicitly
        }
 
        int[] envc = new int[1];
        byte[] envBlock = ProcessEnvironment.toEnvironmentBlock(environment, envc); 
        int[] std_fds; 
        FileInputStream  f0 = null;
        FileOutputStream f1 = null;
        FileOutputStream f2 = null;
 
        try {
            if (redirects == null) {
                std_fds = new int[] { -1, -1, -1 };
            } else {
                std_fds = new int[3];
 
                if (redirects[0] == Redirect.PIPE)
                    std_fds[0] = -1;
                else if (redirects[0] == Redirect.INHERIT)
                    std_fds[0] = 0;
                else {
                    f0 = new FileInputStream(redirects[0].file());
                    std_fds[0] = fdAccess.get(f0.getFD());
                }
 
                if (redirects[1] == Redirect.PIPE)
                    std_fds[1] = -1;
                else if (redirects[1] == Redirect.INHERIT)
                    std_fds[1] = 1;
                else {
                    f1 = new FileOutputStream(redirects[1].file(),
                                              redirects[1].append());
                    std_fds[1] = fdAccess.get(f1.getFD());
                }
 
                if (redirects[2] == Redirect.PIPE)
                    std_fds[2] = -1;
                else if (redirects[2] == Redirect.INHERIT)
                    std_fds[2] = 2;
                else {
                    f2 = new FileOutputStream(redirects[2].file(),
                                              redirects[2].append());
                    std_fds[2] = fdAccess.get(f2.getFD());
                }
            }
 
        return new UNIXProcess
            (toCString(cmdarray[0]),
             argBlock, args.length,
             envBlock, envc[0],
             toCString(dir),
                 std_fds,
             redirectErrorStream);
        } finally {
            // In theory, close() can throw IOException
            // (although it is rather unlikely to happen here)
            try { if (f0 != null) f0.close(); }
            finally {
                try { if (f1 != null) f1.close(); }
                finally { if (f2 != null) f2.close(); }
            }
        }
    }

new UNIXProcess 环境


 

final class UNIXProcess extends Process {

3. 总结

Runtime用处非常多,偏底层

比如GC调用

加载jar文件

Runtime功能强大,但需要合理利用,很多攻击是通过Runtime执行的漏洞

但是使用shutdownhook还是很方便的,用来做停止任务的后续处理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Java Runtime的使用详解

本文链接: https://www.lsjlt.com/news/159981.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Runtime的使用详解
    目录前言1. shutdownhook2. exec执行2.1 常规命令执行2.2 管道符2.3源码分析3. 总结前言 最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分...
    99+
    2024-04-02
  • Java Runtime的使用方法是什么
    这篇文章将为大家详细讲解有关Java Runtime的使用方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言最近做项目框架,需要在框架结束的时候,关闭服务器连接,清除部分...
    99+
    2023-06-22
  • Java Runtime类详解_动力节点Java学院整理
    一、概述      Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。一般不能实例化一个Runtime对象,应...
    99+
    2023-05-31
    java runtime
  • IOS开发Objective-C Runtime使用示例详解
    目录前言一些关键字消息传递 (Messaging)KVO关联对象 (Associated Objects)AOP(Method Swizzling)其它前言 Runtime&nbs...
    99+
    2023-02-13
    Objective-C Runtime iOS开发
  • Java中Process与Runtime()的使用示例
    这篇文章主要介绍Java中Process与Runtime()的使用示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java Process与Runtime()使用java调用cmd执行bat文件有时会出现卡死的现象...
    99+
    2023-06-15
  • 详解RustSubstrate框架中的Runtime
    目录引言Runtime 概述Runtime API。Runtime 模块:Runtime 库:Runtime 升级总结引言 Substrate 是一个区块链开发框架,它提供了一系列模...
    99+
    2023-05-18
    Rust Substrate框架Runtime Substrate Runtime
  • Java Process与Runtime()的使用及调用cmd命令阻塞的解决方案
    Java Process与Runtime()使用 java调用cmd执行bat文件有时会出现卡死的现象,当时感觉很迷惑,后来查资料,本来一般都是这样来调用程序并获取进程的输出流的,但...
    99+
    2024-04-02
  • Java CompletableFuture的使用详解
    目录CompletableFuture​任务开启任务结束串行任务thenApply\thenApplyAsync 串行将异步结果进行同步\异步的处理handle\hand...
    99+
    2024-04-02
  • Java ThreadLocal的使用详解
    目录1. 应用场景1.1. 保障线程安全1.2. 显示传递参数2. 实现原理3. 注意事项ThreadLocal是线程私有的局部变量存储容器,可以理解成每个线程都有自己专属的存储容器...
    99+
    2024-04-02
  • Vue完整版和runtime版的区别详解
    目录创建Vue实例的三种方式从HTML得到视图用JS构建视图使用vue-loader两者对比最佳实践SEO友好创建Vue实例的三种方式 从HTML得到视图 前提:使用完整版,CDN...
    99+
    2022-12-21
    Vue完整版runtime版区别 Vue runtime
  • java使用Runtime执行系统命令遇到的问题
    目录使用Runtime执行系统命令遇到的问题参数含义下面是实现代码java Runtime.exec() 执行举个例子使用Runtime执行系统命令遇到的问题 java执行系统命令的...
    99+
    2024-04-02
  • 详解Java中Javassist的使用
    目录开篇Javassist 常用类Javassist 的使用依赖代码示例如何实现类似 AOP 的功能开篇 说起 AOP 小伙伴们肯定很熟悉,无论是 JDK 动态代理或者是 CGLIB...
    99+
    2023-05-14
    Java Javassist使用 Java Javassist
  • Java中的SimpleDateFormat使用详解
    public class SimpleDateFormat extends DateFormatSimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 ...
    99+
    2023-05-31
    simpledateformat 使用 dat
  • 详解Java 中 RMI 的使用
    目录RMI 介绍RMI 工作原理RMI 开发RMI ServerRMI ClientRMI 测试serialVersionUID 的生成 RMI 介绍 RMI (Remote Met...
    99+
    2024-04-02
  • Java使用ChatGPT的API详解
    目录介绍验证发出请求创建聊天PostMan实例介绍 OpenAI API 几乎可以应用于任何涉及理解或生成自然语言或代码的任务。我们提供一系列具有不同功率级别的模型,适用于不同的任务...
    99+
    2023-05-18
    Java使用ChatGPT的API Java ChatGPT的API
  • JAVA Future类的使用详解
    目录前言生活中的Future模式场景1:场景2Future模式中的主要角色实现一个简单的Future模式Java中的Future模式Future模式的高阶版本—— Completab...
    99+
    2024-04-02
  • Java中Lombok的使用详解
    这篇文章主要介绍“Java中Lombok的使用详解”,在日常操作中,相信很多人在Java中Lombok的使用详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中Lombok的使用详解”的疑惑有所帮助!...
    99+
    2023-06-16
  • Java中MessageFormat的使用详解
    用于字符串替换,你还在用以下的这种方法吗? String.format(String format, Object... args) 这是String类型的静态方法,但是除此之外,...
    99+
    2024-04-02
  • Java 封装的使用详解
    目录1. 基本介绍2. 封装介绍3. 封装的理解和好处4. 封装的实现步骤 (三步)5. 快速入门案例6. 将构造器和 setXxx 结合7. 练习1. 基本介绍 面向对象编程有三大...
    99+
    2024-04-02
  • Java之PreparedStatement的使用详解
    PreparedStatement介绍 可以通过调用 Connection 对象的 prepareStatement(String sql) 方法获取 PreparedSt...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作