Java - 使用exec()方法运行另一个进程

时间:2014-01-12 21:20:04

标签: java linux eclipse exec

我无法在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

1 个答案:

答案 0 :(得分:0)

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

Thread.sleep(2000);

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

如果其他人想出更好的解决方案,我打算不予回答。

编辑:

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