标签: processbuilder

从Java执行另一个应用程序

我需要执行一个执行另一个Java应用程序的批处理文件.我不关心它是否成功执行,我不必捕获任何错误.

是否可以使用ProcessBuilder执行此操作?如果我不捕获错误会有什么后果?

但是,我的要求只是执行另一个Java应用程序.

java processbuilder

17
推荐指数
5
解决办法
12万
查看次数

通过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 ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        try {
            int exitValue = process.waitFor();
            System.out.println("\n\nExit Value is " + exitValue);
        } catch (InterruptedException e) {
            e.printStackTrace(); …
Run Code Online (Sandbox Code Playgroud)

java elevation processbuilder

15
推荐指数
1
解决办法
6167
查看次数

Java ProcessBuilder在Linux中顺序启动执行多个命令

我想使用ProcessBuilder类通过我的Java Application顺序执行2个或更多命令.我尝试了其他响应/论坛中建议的多个选项,但没有运气.

以下是我尝试过的事情:

    ProcessBuilder processBuilder = new ProcessBuilder("ls", ";", "pwd");
Run Code Online (Sandbox Code Playgroud)

给我以下错误:

错误:ls:;:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录

    ProcessBuilder processBuilder = new ProcessBuilder("ls", "&&", "pwd");
Run Code Online (Sandbox Code Playgroud)

给我类似的错误:

错误:ls:&&:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录

    List<String> command = new ArrayList<String>();
    command.add("ls");
    command.add(";");
    command.add("pwd");
    ProcessBuilder processBuilder = new ProcessBuilder(command);
Run Code Online (Sandbox Code Playgroud)

给我以下错误:

错误:ls:;:没有这样的文件或目录错误:ls:pwd:没有这样的文件或目录

我的操作系统是Linux/Mac-OSX.

java processbuilder

15
推荐指数
2
解决办法
2万
查看次数

ProcessBuilder与Runtime.exec()

哪一个更好?更好的意思是哪一个具有更好的安全性等(不易于使用).

java runtime.exec processbuilder

14
推荐指数
1
解决办法
3881
查看次数

使用带有超时的scala.sys.process

我觉得extreemly酷使用标准语法

import scala.sys.process._
    val countLogger = ProcessLogger(line => {println ("out line: " + line)},
                                 line => {println ("err line: " + line)})

    val exitCode = ("cat prog.c" #&& "gcc prog.c -o prog -lm" 
            #&& "echo running, this may hang" #&& "prog.exe") ! countLogger

    println("exitCode = " + exitCode)
Run Code Online (Sandbox Code Playgroud)

然而,最后一个进程会挂起.是否可以在超时时杀死它?

scala processbuilder

14
推荐指数
1
解决办法
2627
查看次数

使用Runtime.exec/ProcessBuilder.start以低优先级启动Java进程?

我正在尝试使用ProcessBuilder类通过Java启动外部进程,这很有用.目前正在使用命令运行:

new ProcessBuilder("java", "-jar", jarfile, args);
Run Code Online (Sandbox Code Playgroud)

我想做的就是这样,但要以低优先级开始这个过程.我的程序目前只在Windows上运行,因此我可以使用特定于窗口的解决方案.一些研究建议我使用"start"命令,但是当我尝试从Java执行此操作时,它会给出一个异常,说它是一个无法识别的命令(同样的命令可以从cmd.exe运行).

有没有人知道如何从Java启动进程(特定于Windows,如果需要),具有belownormal优先级?

java windows windows-task-scheduler processbuilder

13
推荐指数
1
解决办法
2万
查看次数

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();  
 }
Run Code Online (Sandbox Code Playgroud)

java process runtime.exec processbuilder

13
推荐指数
2
解决办法
2万
查看次数

如何在动态捆绑安装的Equinox中运行子流程?

我有一个在OSGi/Equinox中运行的Java应用程序.从这个应用程序,我需要生成ProcessBuilder.start()在OSGi/Equinox中运行的Java子进程(例如via ),以便正确处理类加载.子流程需要多个捆绑包,所以我理想地喜欢在子流程'Equinox容器中安装这些捆绑包的一些相当动态的方法,例如通过读取feature.xml文件.

我已经阅读了这里的程序启动,但我没有看到Equinox如何适应它.我也看了成做一些像这样,但它不会是非常动态的,特别是当子进程的入口点束需要多个其他捆绑包,这需要进一步的束等

那么,如何以一种相当动态的方式将bundle加载到容器中来生成一个在OSGi/Equinox中运行的子进程?

注意:我需要使用单独的进程.子进程将使用使用全局变量的JNA本机库进行数据处理(我无法修改本机库).因此,为了能够同时处理不同的数据,数据处理需要在单独的进程中运行.

java osgi eclipse-rcp equinox processbuilder

13
推荐指数
1
解决办法
137
查看次数

Java,Runtime.exec或ProcessBuilder:如何知道文件是shell还是二进制文件?

我正在寻找一种最有效的方法来决定:

  • 我应该使用shell可执行文件预先提供用户提供的命令行
  • 如果是,那可执行文件是什么?(/ bin/sh?/ usr/bin/perl?/ usr/bin/ksh?c:/../ cmd.exe?)

众所周知,要从Java启动shell脚本,应该启动shell:

ProcessBuilder pb = new ProcessBuilder("/bin/sh", "script.sh", "arg1", "arg2);
Run Code Online (Sandbox Code Playgroud)

要启动二进制文件,应该启动二进制文件:

ProcessBuilder pb = new ProcessBuilder("/path/binary", "arg1", "arg2);
Run Code Online (Sandbox Code Playgroud)

如果使用shell执行二进制文件,则会产生错误:

ProcessBuilder pb = new ProcessBuilder("/bin/sh", "/path/binary", "arg1", "arg2);
(sh: cannot execute binary file)
Run Code Online (Sandbox Code Playgroud)

如果在没有shell二进制文件的情况下执行shell脚本,则会产生错误:

ProcessBuilder pb = new ProcessBuilder("script.sh", "arg1", "arg2);
(error 2: file not found)
Run Code Online (Sandbox Code Playgroud)

我的情况是我的应用程序不知道它的启动,二进制或脚本.

启动的应用程序是最终用户提供的事件处理程序.它很可能是在Unix下执行的shell脚本; 但它可以是Windows下的*.cmd,或者是在一些不起眼的平台下执行的Perl脚本.毕竟它是Java.

我的第一个天真的尝试是用shell启动命令行,看它是否有效.如果没有,请尝试将其作为二进制文件执行.

这是丑陋和冒险的:在平台和shell的一些未知组合下,第二次运行仍然可能仍然执行脚本,第二次,具有不可预测的结果.

此外,我无法判断脚本何时启动正常并且由于某些问题而失败,因为我无法启动它.

我现在正在考虑的最好的事情是:

  • 阅读脚本并查找任何不可打印的字节
  • 如果找到,请将其视为二进制
  • 如果没有,请添加/ bin/sh(如果在Windows下,则添加cmd.exe)

如果您有任何更好的想法,请告知.

更新/部分解决方案

感谢所有与我分享他们想法的人.

事实证明,我把自己和互联网的其他部分弄糊涂了:)

在用户输入的命令行之前不需要在应用二进制文件前加前缀,前提是:

  1. 该脚本位于PATH中
  2. (对于Unix)脚本是可执行的
  3. (对于Unix)脚本有#!/ path/to/interpreter

当我测试我的代码时,这些条件中的一个或另一个没有达到.:-(

从临时脚本执行测试后,脚本已经执行完毕.

第3点只能由用户完成,并且必须在用户手册中记录.

由于这些脚本传播到目标系统的方式,它们可能不可执行,可能不在PATH中.

我关心的唯一路径是相对路径,因此将./添加到任何相对路径就足够了.

使脚本在Unix(以及任何其他平台)下可执行是一个更大的挑战.这不是WORA.在它前面放置/ bin/sh可能会有所帮助,但如果我记得在Solaris下,shell将不会执行不可执行的脚本. …

java shell exec processbuilder

11
推荐指数
1
解决办法
4887
查看次数

为ProcessBuilder设置环境

我从Java(1.6)设置Linux环境有一个奇怪的问题; 特别是"PATH"变量.

简而言之,我有一个用于运行本机进程的管道,它使用java.lang.ProcessBuilder.用户可以选择通过HashMap命名设置环境变量environment:

ProcessBuilder pb = new ProcessBuilder(args);
Map<String, String> env = pb.environment();
if (environment != null)
   env.putAll(environment);
Process process = pb.start();
Run Code Online (Sandbox Code Playgroud)

env变量被设置正确,如果我把它转储到控制台,与PATH变量正确的值.但是,运行该进程会导致抛出Exception:

java.io.IOException: error=2, No such file or directory

在终端shell中使用相同的环境变量运行相同的进程.为了测试这个,我在终端后设置环境后运行Eclipse.在这种情况下,该ProcessBuilder过程正确运行.

所以必须发生的是,ProcessBuilder我没有使用我为它设置的环境,而是使用当前的系统环境.

我在网上找不到任何满意的答案.也许这是特定于操作系统的问题?还是别的我错过了什么?

java environment-variables processbuilder

10
推荐指数
3
解决办法
3万
查看次数