Tag: 进程

如何将Process的输入/输出流复制到系统对应的流程?

这是对这个问题的跟进。 答案表明存在 将Process out,err和输入流复制到System版本 使用IOUtils.copy如下(修复各种编译错误后): import org.apache.commons.io.IOUtils; import java.io.IOException; public class Test { public static void main(String[] args) throws IOException, InterruptedException { final Process process = Runtime.getRuntime().exec(“/bin/sh -i”); new Thread(new Runnable() {public void run() { try { IOUtils.copy(process.getInputStream(), System.out); } catch (IOException e) {} } } ).start(); new Thread(new Runnable() {public void run() { try […]

System.exit的替代方案(1)

由于各种原因,在编写Java应用程序时调用System.exit是不受欢迎的,那么如何通知调用进程并非所有内容都按计划进行? 编辑: 1是任何非零退出代码的standin品。

我们的Java程序的外部程序

如何用Java编写将执行另一个程序的程序? 此外,该程序的输入应该从我们的程序中提供,该程序的输出应该写入文件中。 这是我获取输出的一小部分代码: Process p = Runtime.getRuntime().exec(“C:\\j2sdk1.4.0\bin\\helloworld.java”); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((line = input.readLine()) != null) System.out.println(line); input.close(); 这是我的代码集,但这会引发IOException 。

Java:除非手动刷新,否则无法从Process获取stdout数据

我正在用Java编写命令行程序的终端包装器,并使用ProcessBuilder生成子进程。 要将键e.getKeyChar()子e.getKeyChar() ,我只需将GUI中的e.getKeyChar()直接写入e.getKeyChar()给出的OutputStream 。 为了从子进程接收输出,我基本上有一个从子进程的stdout读取的while循环: while ((b = br.read()) != -1) { System.out.println(“Read “+b); bb[0] = (byte) b; // call an event listener with the read byte listener.dataReceived(bb); } 只有当我立即冲洗两端的输出时,这才有效。 也就是说,我必须刷新每个用户输入,并且子进程必须刷新自己的stdout才能发生这些事情。 否则, read()阻塞,等待数据,这些数据从未实际发送过(子进程’stdout只是保持缓冲)。 我怎样才能进行I / O操作? 示例终端子进程: #include int main() { char c; while((c = getchar()) != -1) { printf(“Got: %d\n”, c); // doesn’t work […]

在Java中生成一个在JVM关闭后幸存的进程

我需要在Java(仅在Linux下)生成一个进程,该进程将在JVM退出后继续运行。 我怎样才能做到这一点? 基本上,Java应用程序应该生成一个更新程序,它会停止Java应用程序,更新文件然后再次启动它。 我对hack&slash方法感兴趣,只是为了让它工作以及更好的设计方案,如果你有一个:)

为什么Process.waitFor()永远不会返回?

我以下列方式从Java代码启动一个Windows进程(用C ++编写但我没有源代码): Process p1 = Runtime.getRuntime().exec(cmdAndParams); p1.waitFor(); 我的问题是waitFor()方法永远不会结束。 因此,我尝试在一个简单的shell中启动该过程,并在shell中使用许多打印正确结束(我猜是标准输出)。 因此,我决定创建并启动读取标准输出的线程,即使我现在不需要这些输出。 这解决了这个问题。 所以我的问题是以下问题:这个解决方案是“启动并等待具有输出的外部进程的Java标准”,还是意味着本机进程中存在某个问题? 如果存在这样的问题,那么C ++编程“错误”可能是问题的根源?

IllegalStateException:AsyncContext.startAsync(req,res)不支持

我创建了一个servlet 3.0来探索异步请求处理: @WebServlet(name=”MyTest”, urlPatterns={“/MyTest”}, asyncSupported=true) public class MyTest extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { AsyncContext tmp = req.startAsync(req, res); … } } 但是当.startAsync(…)时,我得到一个IllegalStateException 。 我知道Javadoc提到了exception,但我明确地启用了异步(cf WebServlet注释)。 我正在使用随NetBeans提供的Tomcat 7.0.11.0。 我可以确认req.isAsyncSupported()返回false。 我究竟做错了什么? 我还需要做什么来启用异步处理? 编辑: 我试图实现以下示例并得到相同的问题。

Runtime.getRuntime()。exec(cmd)挂起

我正在执行一个命令,它返回一个文件的修订号; ‘文件名’。 但是如果执行命令时出现问题,则应用程序会挂起。 我该怎么做才能避免这种情况? 请在下面找到我的代码。 String cmd= “cmd /C si viewhistory –fields=revision –project=”+fileName; Process p = Runtime.getRuntime().exec(cmd) ; BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; while ((line = in.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); }

启动Chrome并等待它关闭

题 我想启动Chrome网络浏览器作为访问特定网站的过程,然后等到它关闭。 一种特殊情况是浏览器可能已经打开并运行,因为用户可能已经访问过某个网站。 在这种情况下,浏览器可能会在现有窗口中打开一个新选项卡,新启动的进程将立即终止。 这不应该混淆我的等待过程:要么,我想要一个新的浏览器窗口(如果可以某种方式强制执行,可能通过命令行参数)并等待它关闭,或保持现有的浏览器窗口并等待所有选项卡结果从我的过程关闭。 环境 我认为没关系,但我的编程环境是Java ,你可以假设我知道浏览器的路径。 例 我可以获得预期行为的唯一浏览器是Internet Explorer (叹息)。 在这里,我需要基本上在一个临时文件夹中创建一个新的批处理脚本 start /WAIT “” “C:\Program Files\Internet Explorer\iexplore.exe” -noframemerging http://www.test.com/ 然后我运行批处理脚本而不是直接浏览器,并在等待完成后删除它。 预期的过程 使目标过程更清晰: 我的程序开始了。 我的程序将Chrome浏览器作为单独的进程启动,并提供一个URL作为该进程的参数进行访问。 Chrome浏览器作为新进程异步运行,并访问提供的URL。 到目前为止,这很容易。 启动新进程(Chrome浏览器)后,我自己的程序应该等待所述进程终止。 这是困难的部分,因为 许多现代浏览器启动多个进程。 我需要等待所有这些。 许多现代浏览器可能以某种方式“脱离”我自己启动的进程。 对不起,我不知道一个更好的词,我的意思是:我启动一个进程然后启动另一个进程并立即终止,而另一个进程继续运行。 如果我等待我的程序最初启动的浏览器进程,则在浏览器仍处于打开状态时等待将完成。 上面的一个特例是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地传达URL以访问现有流程并终止。 当我的程序认为她已关闭浏览器时,用户仍在我提供的URL上。 通过指定特殊的命令行参数(例如IE的noframemerging可能会禁止此问题。 一旦浏览器终止或者与我提供的URL相关的所有标签都已关闭,我的程序将停止等待,而是继续开展业务。 用例是我有一个可以在本地运行或在服务器上运行的Web应用程序。 如果它在本地运行,它将启动Web服务器,然后打开浏览器以访问条目页面。 关闭浏览器后,该Web应用程序也应该关闭。 这对于Internet Explorer来说是可靠的,对于所有其他情况,用户必须关闭浏览器,然后明确地关闭Web应用程序。 因此,如果我能够可靠地等待Chrome完成,这将使用户体验更好。 方案偏好: 解决方案按以下顺序排列 任何与纯Java JRE一起提供的东西。 这包括浏览器的特殊命令行参数。 需要我做的事情,例如,创建批处理脚本(例如在IE的情况下)。 任何需要第三方开源库的东西。 任何需要3rth党闭源图书馆的东西。 任何独立于平台的答案(同时适用于Windows和Linux)都优先于平台相关的答案。 理由:在理想情况下,我想知道究竟是做了什么,并将其包含在我自己的代码中。 […]

JVM进程与JVM堆内存使用情况

我已经阅读了这个Process Memory Vs Heap – JVM ,我遇到了同样的问题。 jvm进程内存使用量不断增加,从不收缩。我通过在linux服务器上做一个top来检查。 应用程序正在将作业调度到集群(使用Quartz + Sun Java DRMAA API) Java堆空间在应用程序生命周期中保持在限制范围内,但是jvm进程显示内存使用量稳步攀升并且永远不会下降。 这是内存泄漏吗? 如果是这样,为什么堆空间在限制范围内。 有人可以解释一下。 更新:当我通过jconsole跟踪时,我有-Xmx1600m -Xms1600m我可以看到堆空间在这个限制范围内,距离为450m,但是top命令显示该进程使用了​​超过900m。