Tag: processbuilder

Java的ProcessBuilder在哪里执行命令?

当我使用ProcessBuilder执行命令时,它如何知道在哪里查找该命令? 使用这个hack /技巧我修改了我的PATH变量(通过检查processBuilder.environment()validation)是坏的(空的,工作目录等)但是ProcessBuilder仍然可以执行sort,echo,bash等等。 它是怎么做到的?! 注意:我的特定开发环境是OSX,但此代码也将在Red Hat Enterprise Linux上运行。

为ProcessBuilder设置环境

我从Java(1.6)设置Linux环境有一个奇怪的问题; 特别是“PATH”变量。 简而言之,我有一个用于运行本机进程的管道,它使用java.lang.ProcessBuilder 。 用户可以选择通过HashMap命名environment设置环境变量: ProcessBuilder pb = new ProcessBuilder(args); Map env = pb.environment(); if (environment != null) env.putAll(environment); Process process = pb.start(); 如果我将它转储到控制台,并且PATH变量的值正确,则env变量设置正确。 但是,运行该进程会导致抛出Exception : java.io.IOException: error=2, No such file or directory 在终端shell中使用相同的环境变量运行相同的进程。 为了测试这个,我在终端后设置环境后运行Eclipse。 在这种情况下, ProcessBuilder进程正确运行。 所以必须发生的是ProcessBuilder没有使用我为它设置的环境,而是使用当前的System环境。 我在网上找不到任何满意的答案。 也许这是一个特定于操作系统的问题? 或者其他我错过的东西?

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(); }

ProcessBuilder在Mac上提供“没有这样的文件或目录”,而Runtime()。exec()工作正常

我有一个在Playframework上运行的应用程序,它需要对一些video文件进行编码。 我用了 Process pr = Runtime.getRuntime().exec(execCode) 为此(它完美地工作),但由于我需要输出流和错误流,我试图使用ProcessBuilder(也建议使用)。 但我无法让它工作(在MacBook上测试)。 Runtime方法和ProcessBuilder之间有根本区别吗? 这是我的ProcessBuilder代码(完全相同的代码在被Runtime.getRuntime().exec()替换时有效Runtime.getRuntime().exec() ) String execCode = “/opt/local/bin/ffmpeg -i file […]”; ProcessBuilder pb = new ProcessBuilder(execCode); pb.redirectErrorStream(true); pb.directory(new File(“/Users/[…]/data/”)); Process pr = pb.start(); 这是控制台输出: 11:00:18,277 ERROR ~ There was a problem with with processing MediaFile[13] with error Error during coding process: Cannot run program “/opt/local/bin/ffmpeg -i /Users/[…]/data/media/1/1/test.mov […] […]

如果父进程不在Java中使用stdout / stderr,为什么进程会挂起?

我知道如果你在Java中使用ProcessBuilder.start来启动外部进程,你必须使用它的stdout / stderr(例如,见这里 )。 否则外部进程会在启动时挂起。 我的问题是为什么它以这种方式工作。 我的猜测是JVM将执行过程的stdout / stderr重定向到管道,如果管道没有空间,则对管道的写入阻塞。 是否有意义? 现在我想知道为什么 Java会这样做。 这个设计背后的理由是什么?

流程需要重定向输入

我有一个UNIX本机可执行文件,需要像这样输入参数 prog.exe <foo.txt。 foo.txt有两行:bar baz 我正在使用java.lang.ProcessBuilder来执行此命令。 不幸的是,prog.exe只能使用文件中的重定向。 有什么方法可以模仿Java中的这种行为吗? 当然, ProcessBuilder pb = new ProcessBuilder(“prog.exe”, “bar”, “baz”); 不起作用。 谢谢!

Process Builder waitFor()问题和打开文件限制

我inheritance了一些代码: Process p = new ProcessBuilder(“/bin/chmod”, “777”, path).start(); p.waitFor(); 基本上,存在一些古老且高度基于巫术的原因,用于将键/值对作为文件存储在磁盘上。 我真的不想进入它。 但是,我留下了一堆IOexception: Exception :Cannot run program “/bin/chmod”: java.io.IOException: error=24, Too many open files Message: Cannot run program “/bin/chmod”: java.io.IOException: error=24, Too many open files 一堆我的意思是在1万亿的领域 我感觉waitFor调用是阻止这些进程等待进程完成它并退出,但我认为chmod在文件实际关闭之前返回结果。 有谁知道这是否是这些例外的原因? 我的另一个倾向是数千个文件的打开和关闭在java端没有快速发生,并且还有其他事情发生,可能是某种forms的文件缓冲区在没有被清除时正在调用fw.close()。 我对java很新,这是一个让我难过的地狱奇怪的东西。 (很高兴应用程序仍以某种方式运行..吐出一个非常大的日志文件后) 任何人都可以想办法解决这个问题,清除缓冲区或增加文件打开限制,以便jvm可以跟上自己(假设这是问题)

使用ProcessBuilder启动CMD

我试图通过使用以下代码在Windows中启动CMD应用程序,但它不能按预期工作。 来自不同网站的几个示例显示,“cmd”作为ProcessBuilder构造中的参数应该有效。 我需要做些什么才能让我的Java应用程序在Windows中打开CMD应用程序? public class JavaTest { public static void main(String[] args) { ProcessBuilder pb = new ProcessBuilder(“cmd”); try { pb.start(); System.out.println(“cmd started”); } catch (IOException e) { System.out.println(e.getMessage()); } } } 当我尝试使用不存在的应用程序时,它实际上会输出错误,这意味着它实际上运行“CMD”。 但CMD应用程序没有按预期弹出?

通过UAC提升ProcessBuilder流程?

我正在尝试运行外部可执行文件,但显然它需要提升。 代码是这样的,从使用ProcessBuilder的示例修改(因此带有一个参数的数组): public static void main(String[] args) throws IOException { File demo = new File(“C:\\xyzwsdemo”); if(!demo.exists()) demo.mkdirs(); String[] command = {“C:\\fakepath\\bsdiff4.3-win32\\bspatch.exe”}; ProcessBuilder pb = new ProcessBuilder( command ); Process process = pb.start(); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; System.out.printf(“Output of running %s is:\n”, Arrays.toString(command)); while […]

从Java执行另一个应用程序

我需要执行一个执行另一个Java应用程序的批处理文件。 我不关心它是否成功执行,我不必捕获任何错误。 是否可以使用ProcessBuilder执行此操作? 如果我没有捕获错误会有什么后果? 但是,我的要求只是执行另一个Java应用程序。