标签: processbuilder

Java的ProcessBuilder在哪里执行命令?

当我使用命令执行命令时ProcessBuilder,它如何知道在哪里查找该命令?使用这个hack /技巧我修改了我的PATH变量(通过检查验证processBuilder.environment())是坏的(空的,工作目录等)但是ProcessBuilder仍然可以执行sort,echo,bash等等.它是怎么做到的?!

注意:我的特定开发环境是OSX,但此代码也将在Red Hat Enterprise Linux上运行.

java command path processbuilder

4
推荐指数
1
解决办法
6064
查看次数

processbuilder 从 Java 运行命令

我正在从 Java 代码运行 shell 命令,ProcessBuilder.start() 当命令完成执行时,我需要回调(或某种通知)。该命令需要 10-15 秒才能执行。可以使用吗ProcessBuilder

java callback processbuilder

4
推荐指数
2
解决办法
1449
查看次数

ProcessBuilder在Process可以找不到指定的文件

我试图从Java程序运行一个jar文件,我成功使用getRuntime():

Process processAlgo = Runtime.getRuntime().exec("java -jar "+algoPath);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用时,ProcessBuilder我得到了The system cannot find the file specified异常:

ProcessBuilder builder = new ProcessBuilder("java -jar " + algoPath);
Process processAlgo = builder.start();
Run Code Online (Sandbox Code Playgroud)

我试图更改指定文件的位置,并指示其完整路径,但它不起作用.什么可能导致问题?

java process processbuilder

4
推荐指数
1
解决办法
4247
查看次数

使用 java processbuilder 运行 bat 文件

我正在尝试使用 java 进程构建器执行 .bat 文件,但它没有启动进程。请告诉我我在这里做错了什么。当我用 ./file.sh 替换 file.bat 时,此代码适用于 linux 环境

final ArrayList<String> command = new ArrayList<String>();
command.add(WORKING_DIR+File.separator+"file.bat");
final ProcessBuilder builder = new ProcessBuilder(command);
try {
    builder.redirectErrorStream(true);
    builder.start();
    } catch (IOException e) {
      logger.error("Could not start process." ,e);
} 
Run Code Online (Sandbox Code Playgroud)

java batch-file processbuilder

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

从Windows使用ProcessBuilder执行命令

当我尝试从Windows机器上的java程序执行以下行时,我收到以下错误.

能告诉我这些工作的详细步骤吗?

final Process exec = new ProcessBuilder("bash", "-c", query).start();
Run Code Online (Sandbox Code Playgroud)

错误:java.io.IOException:无法运行程序"bash":CreateProcess error = 2,系统找不到指定的文件

java windows process processbuilder

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

Java processbuilder 和使用环境变量

我想做的是我想要运行一个进程,但是由于这个进程本身依赖于环境变量,直接调用它会导致进程内出错。对于那些想知道这是什么的人来说,它是rake工具。出于这个原因,我认为也许最好使用bash它并通过使用它bash来消除这个问题。但事实似乎并非如此。

这是我的代码:

public static void runPB(String directory) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder(
                "/bin/bash");
        processBuilder.directory(new File(directory));
        Process process = processBuilder.start();
        OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream());
        osw.write("rake routes");
        osw.close();
        printStream(process.getErrorStream());
        printStream(process.getInputStream());
    }

    public static void printStream(InputStream is) throws IOException {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我知道这是与环境相关的问题,因为我收到的错误描述为无法加载此类文件--bundler/setup (LoadError)

此外,我检查processBuilder.environment()返回的环境变量比输入的少env。我继续更改行osw.write()并在那里尝试echo …

java linux process environment-variables processbuilder

4
推荐指数
1
解决办法
6217
查看次数

"查找:缺少`-exec'的参数"在Java进程构建器中运行

我试图在Jenkins(https://jenkins-ci.org)脚本控制台中运行find命令,该控制台允许从Web界面运行groovy脚本.

我的代码是:

ProcessBuilder pb = new ProcessBuilder();
pb.directory(new File("/var/lib/jenkins/jobs/myJob");
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
command = 'find . -name build.xml -exec echo \"{}\" \\;'
println(command)
pb.command(command.split(" "));
pb.start().waitFor();
Run Code Online (Sandbox Code Playgroud)

Web UI将显示println的结果:

find . -name build.xml -exec echo "{}" \;
Run Code Online (Sandbox Code Playgroud)

jenkins日志(/var/log/jenkins/jenkins.log)记录以下错误:

find: missing argument to `-exec'
Run Code Online (Sandbox Code Playgroud)

但是,如果我find . -name build.xml -exec echo "{}" \;通过shell 运行web UI()中输出的相同命令,则不会出现此类错误.

另外,如果我替换\;witih +,命令有效!

因此,使用processBuilder并且\\;作为命令行参数传递的东西是可疑的

groovy find processbuilder jenkins

4
推荐指数
1
解决办法
615
查看次数

无法使用ProcessBuilder从java执行exe文件

我正在从Java代码本身创建一个运行C,C++和Java的项目.它对Java来说非常好用,在编译和执行C和C++文件时会遇到问题.

我使用此代码获得了正确的编译,我可以获取在指定路径中生成的可执行文件.但是现在当我运行可执行二进制文件时,ProcessBuilder我得到一个错误,说'找不到文件'.请查看代码并告诉我出了什么问题以及在哪里?

public void processCode(String path,String lang)throws IOException
    {
        String cmd="",s=null,out=null,file="";
        totalTime=0;
        ProcessBuilder process=new ProcessBuilder();
        process.directory(new File(path));
        if(lang.equals("c")||lang.equals("cpp"))
        {
            cmd=threadNum+".exe";
            process.command(cmd);
        }
        else if(lang.equals("java"))
        {
            cmd="java";
            file="Main"+threadNum;
            process.command(new String[]{cmd,file});
        }
        process.redirectInput(new File(PATH+"Input\\" + prob + ".txt"));
        process.redirectOutput(new File(PATH+"Output.txt"));
        Process p=process.start();
        long start=System.currentTimeMillis();
        while (true)
        {
            try{
                    if(p.exitValue()==0)
                    {
                        totalTime=(int)(System.currentTimeMillis()-start);
                        break;
                    }
                }
                catch (Exception e)
                {

                }
                if(System.currentTimeMillis()-start>2000)
                {
                    res=1;
                    p.destroy();
                    break;
                }
        }
        if(res!=1)
        {
            compareFile();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里调用该方法 并生成的错误是:

Exception in thread …
Run Code Online (Sandbox Code Playgroud)

java process processbuilder

3
推荐指数
1
解决办法
4061
查看次数

退出后,Java流程构建器子进程继续

我正在开发一个自动更新脚本,该脚本应该能够在守护程序完成后重新启动它.

我正在尝试这个:

    final ArrayList<String> command = new ArrayList<String>();
    String initScriptPath = Config.GetStringWithDefault("init_script", "/etc/init.d/my-daemon");
    command.add("/bin/bash");
    command.add("-c");
    command.add("'" + initScriptPath + " restart'");

    StringBuilder sb = new StringBuilder();
    for (String c : command) {
        sb.append(c).append(" ");
    }
    Log.write(LogPriority.DEBUG, "Attempting restart with: " + sb.toString());

    final ProcessBuilder builder = new ProcessBuilder(command);

    builder.start();

    // Wait for a couple of seconds
    try {
        Thread.sleep(5000);
    } catch (Exception e) {
    }

    System.exit(0);
Run Code Online (Sandbox Code Playgroud)

但是System.exit似乎停止了重启?它确实停止了,但不会重新开始.

java daemon processbuilder

3
推荐指数
1
解决办法
4549
查看次数

无法使用Java ProcessBuilder启动带有参数的shell脚本

我正在尝试使用ProcessBuilder执行带有命令行参数的shell脚本,此shell脚本调用另外两个使用此参数的shell脚本.第一个shell脚本运行正常,但是当第二个脚本启动时,它返回退出代码1.

Java程序的ProcessBuilder片段:

//scenario - A string that holds a numerical value like 1 or 2 etc
String[] command2 = {"/bin/bash", "<path to shell script>/runTemporaryTestSuite.sh", scenario};
ProcessBuilder pb2 = new ProcessBuilder(command2);
Process p2 = pb2.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line;
//print - is an object ref of response.getWriter() //
print.println("Output of running "+Arrays.toString(command2)+" is: ");
while ((line = br.readLine()) != null) {
    print.println(line);
}

try {
   int exitValue = p2.waitFor();
   print.println("<br><br>Exit Value of p2 is " + exitValue); …
Run Code Online (Sandbox Code Playgroud)

java shell exit-code processbuilder

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