Tag: 进程

如何在Java中处理多个流?

我正在尝试运行一个进程,并对其输入,输出和错误流进行处理。 显而易见的方法是使用类似select()东西,但我在Java中唯一可以找到的是Selector.select() ,它接收一个Channel 。 似乎不可能从InputStream或OutputStream获取Channel ( FileStream有一个getChannel()方法,但这在这里没有帮助) 所以,我写了一些代码来轮询所有的流: while( !out_eof || !err_eof ) { while( out_str.available() ) { if( (bytes = out_str.read(buf)) != -1 ) { // Do something with output stream } else out_eof = true; } while( err_str.available() ) { if( (bytes = err_str.read(buf)) != -1 ) { // Do something with error […]

使用Vista的管理员权限启动Java Runtime Process

我想执行一个setup.exe安装程序,它使用java 1.6在vista上安装软件。 用户不是管理员。 当我尝试启动该过程时,我收到错误消息: CreateProcess error=740 表示用户没有足够的权限启动该过程。 我可以提交一个标志或一个选项来表明,该过程应该以管理员权限执行吗? Vista本身在菜单工具栏中具有此function。 我可以在Java中使用此function吗? 我调用以下代码 Runtime rt = Runtime.getRuntime(); Process process; try { String fileToExecute = new File(mFolder, mSetupFiles[0]).getCanonicalPath(); if (logger.isDebugEnabled()) { logger.debug(“Execute runtime process”); } process = rt.exec(fileToExecute, null, mFolder); process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); if (logger.isDebugEnabled()) { logger.debug(“Wait until process is finished”); } process.waitFor(); } catch (IOException e) { […]

与从Java应用程序调用的Powershell进程交互

我正在尝试运行一个Java应用程序,它在启动时创建一个新的PowerShell进程,然后再多次与它进行交互。 调用powershell.exe并让它执行单个命令并返回输出对我来说很好。 如果我不希望powershell进程立即完成/退出但是保持打开以便我可以写入其outputStream并从inputStream接收结果,则会出现问题。 String input = “dir”; String[] commandList = {“powershell.exe”, “-Command”, “dir”}; ProcessBuilder pb = new ProcessBuilder(commandList); Process p = pb.start(); if(input != null) { PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true); writer.println(input); writer.flush(); writer.close(); } //p.getOutputStream().close(); Gobbler outGobbler = new Gobbler(p.getInputStream()); Gobbler errGobbler = new Gobbler(p.getErrorStream()); Thread outThread = new Thread(outGobbler); Thread […]

如何将子进程stdout / stderr重定向到Java中的主进程stdout / stderr?

在其他语言(如bash和Python )中,当我们生成子进程时,这个新进程将从父进程inheritancestdout和stderr。 这意味着子进程的任何输出都将打印到终端以及父进程的输出。 我们如何在Java中实现相同的行为? 我的第一次尝试是: proc = Runtime.getRuntime().exec(cmd); 但它不会起作用。 基于这个答案和这个答案 ,我已经用以下代码替换了代码: ProcessBuilder pb = new ProcessBuilder(cmd); pb.redirectOutput(System.out); pb.redirectError(System.err); 但是这甚至都没有编译,因为参数与预期的方法参数不兼容。

Java process.getInputStream()无需读取,死锁子

我遇到了一些进程包装的问题,它只发生在Windows XP中。 这段代码在Windows 7中完美运行。我真的很难过为什么XP中的流是空的。 我也尝试使用Process.Exec()的String []版本,但它没有任何区别。 我正在使用以下类从进程’STDOUT和STDERR(每个流的一个实例)中读取: import java.util.*; import java.io.*; public class ThreadedStreamReader extends Thread{ InputStream in; Queue messageQueue; public ThreadedStreamReader(InputStream s, Queue q) { in = s; messageQueue = q; } public void run() { try { BufferedReader r = new BufferedReader(new InputStreamReader(in)); String line = null; while((line = r.readLine()) != null) { […]

Java处理子进程

我有一个简单的脚本,使用ProcessBuilder将输出写入控制台。 和OutputStreamWriter见: 带输入/输出流的Java进程 一个早期的线程。 我相信我的问题在于产生子进程并且初始的父进程被终止的事实。 导致OutputStreamWriter抛出java.io.IOException: Broken pipe exception 。 鉴于应用程序正在生成第二个进程,如何将OutputStreamWriter连接到此新进程? 包括能够读回它产生的输出吗? 这在Java中甚至可能吗? Surly java应该能够遵循产生的过程。 谢谢

从java通信到C ++程序

我想从java中执行外部.exe程序。 .exe是一个CLI应用程序,它在运行时接收输入(scanf())并根据输入输出。 我可以调用程序从java执行 Process p = Runtime.getRuntime().exec(“cmd /c start a.exe”); 代替 Process p = Runtime.getRuntime().exec(“cmd /c start a.exe”); 但我认为也可以从java中调用一个程序。 我用C ++编写的整个程序只需要一个用java编写的GUI。 有几点需要注意:= 1)与.exe的通信应该是运行时(不是通过main(args))2)java程序应该取输出并存储在某些变量/面板中以供将来使用3)要执行的程序可以不同(例如用户可以选择一个根本不接受任何输入的.exe。所以基本上java GUI将充当RuntimeEnv public void runEXE() { String s = null; try { Process p = Runtime.getRuntime().exec(“cmd /c a.exe”); System.exit(0); } catch (IOException e) { System.out.println(“exception happened – here’s what I know: “); e.printStackTrace(); […]

Java线程挂起没有死锁

我目前在处理悬挂的过程时遇到了一些麻烦。 首先,下面的线程转储显示没有死锁。 另一个有趣的事情是该进程挂在java.lang.System.identityHashCode方法中。 该进程的当前CPU使用率为0%,有时高峰为1%…通常该进程使用100%。 它使用1.7GB的RAM(这个过程是正常的)。 该机器有足够的CPU,磁盘空间和RAM可用。 Attaching to process ID 4146, please wait… Debugger attached successfully. Server compiler detected. JVM version is 23.7-b01 Deadlock Detection: No deadlocks found. Thread 12761: (state = BLOCKED) Thread 4159: (state = BLOCKED) Thread 4158: (state = BLOCKED) – java.lang.Object.wait(long) @bci=0 (Interpreted frame) – java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=135 (Interpreted frame) – […]

无法从Runtime.getRunTime.exec()获取getInputStream

public class LinuxInteractor { public static String executeCommand(String command) { System.out.println(“Linux command: ” + command); try { Process p = Runtime.getRuntime().exec(command); p.waitFor(); BufferedReader bf=new BufferedReader(new InputStreamReader( p.getInputStream())); String str=bf.readLine(); System.out.println(“inputStream is::”+str); while( (str=bf.readLine()) != null) { System.out.println(“input stream is::”+str); } System.out.println(“process started”); } catch (Exception e) { System.out.println(“Error occured while executing Linux command. Error Description: […]

Rserve服务器:如何终止阻塞实例(eval永远消失)?

我需要以multithreading的方式执行R eval ,这是Rserve提供的很好的东西。 但是,如果一个实例的eval需要太长时间,我需要能够关闭计算阻塞eval的实例。 就我测试而言,给定的实例将拒绝关闭,直到eval完成(显然,它需要在再次侦听之前获取结果)。 所以这是我的问题: 有没有办法在阻塞实例上获取java句柄(类似于Process对象),这样我就可以强制终止/终止eval(比如process.destroy() )? 换句话说,当我要求eval(创建连接,抛出命令)时,如何通过java在正在处理的eval和与之相关的Rsere实例之间建立关系? 或者我是否错过了一些已经允许处理这种需求的Rserve? 注意:我已经尝试通过serverEval()而不是在主实例上运行计算的常规eval运行所有(所有evals),但这当然不满意,因为它只使用一个进程(主要的一个) )。 我可以杀死的那个,但我的主要目标是能够单独关闭一个阻塞的eval,在一个单独的实例上运行。 而且,自然地,保持我的8个CPU内核的优势,也就是说,保持并行性。 除此之外没有必要使用Rserve(在这种情况下JRI引擎就足够了)。 注意:我想避免这种事情( 线程 ),在不同的端口上处理主服务器本身的几个实例。 那不是一个选择。 我已经尝试获取有关Rserve邮件列表的信息,但尚未得到答复。 我希望自己能够清楚地在这里得到答案或有用的评论。 如果没有,请询​​问详情。 非常感谢提前。 编辑:我还测试了RCaller ,它处理了R需要的尽可能多的实例,但是,因为它将结果写入XML文件以便稍后从java端解析(不像Rserve那样真正使用通信协议),它也是我必须执行的速度慢…