【问题标题】:Java - running another process using the exec() methodJava - 使用 exec() 方法运行另一个进程
【发布时间】:2014-01-12 21:20:03
【问题描述】:

我无法从我的 Java 代码中运行另一个 Java 进程。 它应该在后台运行,因此不需要使用流或类似的东西。

我尝试的是几乎在任何地方都能找到的标准方法:

private static Runtime rt = Runtime.getRuntime();
private static Process pr;

在我的 main 方法中,我这样调用 exec() 方法:

pr = rt.exec("java -cp /home/luka/workspace/SocketServer SocketServer");

由于某种原因,这会引发大量异常。当然,有问题的应用程序已经编译成 .class 文件。

这个我也试过了,发现here

pr = rt.exec(new String[] { "/bin/bash", "-c", "java -classpath /home/luka/workspace/SocketServer SocketServer" });

当我尝试使用终端执行相同的命令时,它工作得很好。 我认为这可能是一个安全问题,但我不太确定,因为我可以执行上述命令而无需“sudo”。

另外,这行代码是需要还是在主进程关闭时隐式销毁子进程?

pr.destroy();

我正在尝试使用 Eclipse 在 Linux 上运行它。 如果这是一个重复的问题,我很抱歉,但我已经解决了大多数类似的问题,但无法找到合适的解决方案。

例外:

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.7.0_25]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[na:1.7.0_25]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[na:1.7.0_25]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[na:1.7.0_25]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.7.0_25]
    at java.net.Socket.connect(Socket.java:579) ~[na:1.7.0_25]
    at java.net.Socket.connect(Socket.java:528) ~[na:1.7.0_25]
    at java.net.Socket.<init>(Socket.java:425) ~[na:1.7.0_25]
    at java.net.Socket.<init>(Socket.java:208) ~[na:1.7.0_25]
    at src.MainWindow.connect(MainWindow.java:213) ~[JAVA_vj10/:na]
    at src.MainWindow.access$2(MainWindow.java:209) ~[JAVA_vj10/:na]
    at src.MainWindow$1.run(MainWindow.java:67) ~[JAVA_vj10/:na]
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) ~[na:1.7.0_25]
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) ~[na:1.7.0_25]
    at java.awt.EventQueue.access$200(EventQueue.java:103) ~[na:1.7.0_25]
    at java.awt.EventQueue$3.run(EventQueue.java:694) ~[na:1.7.0_25]
    at java.awt.EventQueue$3.run(EventQueue.java:692) ~[na:1.7.0_25]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_25]
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) ~[na:1.7.0_25]
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) ~[na:1.7.0_25]
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) ~[na:1.7.0_25]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) ~[na:1.7.0_25]
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) ~[na:1.7.0_25]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) ~[na:1.7.0_25]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) ~[na:1.7.0_25]
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) ~[na:1.7.0_25]

输出

System.out.println(pr.getErrorStream().toString());
System.out.println(pr.getInputStream().toString());

是:

java.lang.UNIXProcess$ProcessPipeInputStream@4443ad java.lang.UNIXProcess$ProcessPipeInputStream@1b74334

【问题讨论】:

  • 如果你能发布异常,那就太好了。
  • @SotiriosDelimanolis 我已经更新了我的帖子。
  • 看起来该异常与您发布的代码无关。
  • @SotiriosDelimanolis 我不知道它可能是什么,因为当我尝试从终端运行它时没有抛出异常。
  • 堆栈跟踪告诉您异常发生的确切位置。 src.MainWindow.connect 213 行。

标签: java linux eclipse exec


【解决方案1】:

我试过在 exec() 之后调用它,虽然它看起来很愚蠢,但它确实有帮助:

Thread.sleep(2000);

当然,我会尝试一些较低的值。 我认为,问题在于,在我的代码尝试在引发我提供的异常的方法中使用它之后,我需要初始化的过程。 疯了,如果你问我的话。

我打算不回答这个问题,以防其他人提出更好的解决方案。

编辑:

这种方法似乎也有助于破坏进程。 我只是在我的主窗口上添加了一个关闭事件,之后我立即调用了 destroy() 和 sleep()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多