`
mayday85
  • 浏览: 46271 次
  • 性别: Icon_minigender_1
  • 来自: 污点星狗屎国
文章分类
社区版块
存档分类
最新评论

[吐槽]process.destroy()不能触发关闭钩子

 
阅读更多

本来是个对个体失效不太敏感的Worker进程
为了尽善尽美决定加个关闭钩子(其实是为了逃避半夜上线找个理由...)

于是开开心心的写了如下代码测试

        String path = "E:/IdeaProjects/WebClipper/out/test/boss/";
        Process process =
                new ProcessBuilder("java", "ShutdownHookTest")
                        .directory(new File(path))
                        .start();
        ProcessUtils.drainInBackgroundAndPrint(process.getInputStream());//这里只是输出而已
        Thread.sleep(5000l);
        process.destroy();
        process.waitFor();


        Runtime.getRuntime().addShutdownHook(new Thread(){
            @Override
            public void run() {
                System.out.println("Hook run.");
            }
        });

        System.out.println("Just test.");

        while (true)
            Thread.sleep(1000l);


结果……
Just test.
Process finished with exit code 0


灰常不爽……

必须自己实现一个安全关闭

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        bw.write("exit");
        bw.flush();
        bw.close();


        new Thread(){
            @Override
            public void run() {
                try {
                    new BufferedReader(new InputStreamReader(System.in)).readLine();
                } catch (IOException ignored) {
                }
                System.exit(0);
            }
        }.start();


完全不优雅嘛,这样还不行,Worker进程我觉得是不能信任的
一段时间后还得调用process.destroy()还安全

与其这样还不如taskkill搞下?
分享到:
评论

相关推荐

    Unity3D脚本:Object.Destroy 销毁1

    在Unity3D游戏开发中,`Object.Destroy`函数是一个至关重要的功能,用于在运行时动态地从场景中移除游戏对象、组件或者资源。这个功能的使用灵活性极高,可以优化性能,减少不必要的计算负担,特别是在处理临时性...

    如何检测Unity3D中的Gameobject的destroy事件来触发其他操作?2

    在Unity3D中,开发游戏时常常需要监听游戏对象(GameObject)的生命周期事件,特别是当对象被销毁(Destroy)时,可能需要执行某些清理工作或触发相关联的逻辑。标题和描述提到的问题是关于如何在Gameobject被销毁时...

    JAVA Process 使用

    在Java编程语言中,`Process`类是处理操作系统进程的核心组件。它允许Java应用程序与操作系统交互,执行外部命令,例如运行系统工具或者控制其他应用程序。本文将深入探讨`JAVA Process`的使用,以及如何通过Java...

    深入研究java.lang.Process类.doc

    Java.lang.Process 类深入研究 Java.lang.Process 类是 Java 类库中的一个核心部分,它提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法。下面将对 Process 类...

    发布一个基于BER编码的CDR文件高速解码程序——destroy for linux

    通常CDR文件都是经过压缩后保存在磁盘的,该程序可以直接读取经过压缩后的CDR文件,不需要把它首先解压缩,然后再解码,进一步提供效率。同时,这个程序也支持压缩输出文件,为用户提供方便。目前支持的压缩格式有...

    发布一个基于BER编码的CDR文件高速解码程序——destroy for solaris

    通常CDR文件都是经过压缩后保存在磁盘的,该程序可以直接读取经过压缩后的CDR文件,不需要把它首先解压缩,然后再解码,进一步提供效率。同时,这个程序也支持压缩输出文件,为用户提供方便。目前支持的压缩格式有...

    发布一个基于BER编码的CDR文件高速解码程序——destroy for tru64

    通常CDR文件都是经过压缩后保存在磁盘的,该程序可以直接读取经过压缩后的CDR文件,不需要把它首先解压缩,然后再解码,进一步提供效率。同时,这个程序也支持压缩输出文件,为用户提供方便。目前支持的压缩格式有...

    JAVA-DOS-command.rar_DOS java_dos command_java dos_shelf

    执行命令后返回一个`java.lang.Process`对象,通过该对象可以获取命令执行的输出、错误流以及控制进程的生命周期(如终止进程)。 2. **调用DOS命令**: 调用DOS命令通常涉及到以下步骤: - **创建Runtime对象**...

    WEB服务器工作机制由浅至深(9):【How Tomcat Works】第16章关闭钩子以及之后的章节简述

    - 关闭钩子的执行顺序是不确定的,因此不应依赖它们之间的相对执行时间。 2. **Tomcat中的关闭钩子**: - Tomcat利用关闭钩子来执行服务停止时的清理任务,如卸载Web应用程序、关闭网络连接、停止后台线程等。 -...

    OS.zip_OS process java_java 操作系统

    在Java中,我们不能直接操作底层的进程,但可以通过`java.lang.ProcessBuilder`类来创建和管理外部进程。例如,可以使用`ProcessBuilder.start()`方法来启动一个新的进程,`Process.waitFor()`方法来等待进程完成,...

    Software Testing and Continuous Quality Improvement

    32 3 Quality through Continuous Improvement Process . . . . . . . . . . . 41 Contribution of Edward Deming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Role of Statistical ...

    java智能实现数据库备份.pdf

    process.destroy(); return null; } private static String queryValue(String string, String method) throws IOException { String path = "cmd /c reg query " + string + " /v " + method; Process ...

    基于C++&QT钩子实现屏蔽系统按键、任务管理器、任务栏的实例.zip

    在本项目中,"基于C++&QT钩子实现屏蔽系统按键、任务管理器、任务栏的实例.zip",我们探讨的是如何利用C++编程语言和QT库来创建一个应用程序,该程序能够拦截并控制系统的特定行为,如阻止用户按下某些键、禁用任务...

    进程交互案例

    在Java中,`java.lang.ProcessBuilder`类和`java.lang.Process`接口是进行进程交互的核心工具。`ProcessBuilder`用于创建新的操作系统进程,并允许设置命令行参数、工作目录和环境变量。一旦启动,它将返回一个`...

    destroy

    标题“destroy”所指的可能是一款名为“桌面破坏”(Desktop Destroy)的软件,它作为一个发泄工具,让用户可以通过虚拟的方式“砸桌面”,从而在电脑上体验一种减压的乐趣。这款软件的设计理念是为了提供一种轻松的...

    VUE使用‘luckysheet‘ is not defined已解决,其他博主方法没有解决请看这里

    然后,你需要确保在Vue的`mounted`生命周期钩子中初始化Luckysheet,因为在这个阶段,DOM已经准备就绪,可以安全地操作。例如: ```javascript export default { name: 'YourComponent', data() { return { ...

    可以在应用程序中启动、关闭其他的应用程序、判断是否

    在C#中,`System.Diagnostics.Process.Start()`方法可以用来启动新的进程;而在Python中,我们可以使用`os.system()`或`subprocess`模块来启动进程。 2. **关闭进程**:同样,关闭进程也需要对应的语言API。Java中...

    VS2015 C++ MFC 等比缩小图片分辨率大小

    oldimg.Destroy(); return false; } int nPreMode = ::SetStretchBltMode(newimg.GetDC(), HALFTONE); newimg.ReleaseDC(); oldimg.Draw(newimg.GetDC(), 0, 0, nWidth, nHeight, 0, 0, oldimg.GetWidth(), ...

    acsociative_destroy.rar_MATLAB destroy_android开发_butaaa_spiderv

    标题中的“acsociative_destroy.rar”可能是一个错误的拼写,根据上下文,可能是与MATLAB和Android开发相关的项目文件。"MATLAB destroy_android开发"这部分描述可能指的是使用MATLAB进行Android应用程序的开发或者...

    Java软件开发实战 Java基础与案例开发详解 9-3 Rintime类的使用 共6页.pdf

    process.destroy(); } } ``` #### 示例:读取外部程序的输出 当需要与外部程序交互时,可以通过`exec`方法返回的`Process`对象的`getInputStream()`、`getOutputStream()`和`getErrorStream()`方法来获取输入输出...

Global site tag (gtag.js) - Google Analytics