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

标签 java linux eclipse exec

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

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

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

在我的主要方法中,我像这样调用 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 上运行它。 如果这是一个重复的问题,我很抱歉,但我已经解决了大多数类似的问题,但无法找到合适的解决方案。

异常(exception):

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

最佳答案

我尝试在 exec() 之后调用它,它确实有帮助,尽管它看起来很愚蠢:

Thread.sleep(2000);

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

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

编辑:

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

关于Java - 使用 exec() 方法运行另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080419/

相关文章:

javascript - html下载Java

java - Java 中的字符串与 Map 中的键进行比较

PHP Sendmail 参数 Linux

eclipse - 使用 kura 或 MQTT 将消息发布到 kapua

java - 我可以使用超过 32 GB 的堆和压缩 oops

java - 如何在windows和linux环境下打开一个文件夹路径?

linux - 导入 Passenger 存储库后,Nginx 的服务命令无法正常工作

c++ - 测试C++代码的性能

android - 如何使用 Android Activity 修复 "Call requires API level 11"?

java - 安装Ardor3D。我什至无法运行这些示例