2024-09-24 02:24:26 发布
网友
我有一个java程序,它作为进程运行另一个(Python)程序。在
Process p = Runtime.getRuntime().exec("program.py", envp);
如果java程序完成了处理,Python进程也就完成了。finish命令向Python进程发送关闭它的信号。在
finish
在正常情况下,流程是这样关闭的:
但是,当java程序崩溃时,进程并不是关闭的。由于崩溃,未发送关闭命令。是否可以在每次程序终止时自动终止进程?在
嘿@czuk一个ShutdownHook钩子有用吗?这将处理以下场景
Java虚拟机会关闭以响应两种类型的事件:
当最后一个非守护进程线程退出或退出时(相当于,系统出口)方法,或
当用户中断(如键入^C)或系统范围内的事件(如用户注销或系统关闭)时,虚拟机将终止。
当系统意外崩溃时,这并不容易捕获。在
也许使用Thread.setDefaultUncaughtExceptionHandler方法?在
假设崩溃意味着Java程序抛出一个异常,那么当发生异常时,我会终止Python进程。我没有看到你的代码,但是:
class Foo { Process p; private void doStuff() throws Exception { p = Runtime.getRuntime().exec("program.py", envp); // More code ... } private void startStuff() { try { doStuff(); } catch (Exception e) { p.destroy(); } } public static void main(String[] args) { Foo foo = new Foo(); foo.startStuff(); } }
如果只有导致程序崩溃的异常从doStuff()中逃逸,类似这样的方法应该有效。在
doStuff()
即使您不希望程序在完成时以这种方式崩溃,我认为这种方法比将它包装在shell脚本中更好,这样会在某种程度上杀死Python进程。在程序中处理它就不那么复杂了,甚至在程序完成后保留代码可能是个好主意,因为你可能仍然有一些你不知道的bug。在
嘿@czuk一个ShutdownHook钩子有用吗?这将处理以下场景
Java虚拟机会关闭以响应两种类型的事件:
当最后一个非守护进程线程退出或退出时(相当于,系统出口)方法,或
当用户中断(如键入^C)或系统范围内的事件(如用户注销或系统关闭)时,虚拟机将终止。
当系统意外崩溃时,这并不容易捕获。在
也许使用Thread.setDefaultUncaughtExceptionHandler方法?在
假设崩溃意味着Java程序抛出一个异常,那么当发生异常时,我会终止Python进程。我没有看到你的代码,但是:
如果只有导致程序崩溃的异常从
doStuff()
中逃逸,类似这样的方法应该有效。在即使您不希望程序在完成时以这种方式崩溃,我认为这种方法比将它包装在shell脚本中更好,这样会在某种程度上杀死Python进程。在程序中处理它就不那么复杂了,甚至在程序完成后保留代码可能是个好主意,因为你可能仍然有一些你不知道的bug。在
相关问题 更多 >
编程相关推荐