1

尝试使用这段代码执行脚本:

String command = "./myScript.sh";
pb = new ProcessBuilder(command, param1, param2);
pb.directory(directory);
pb.start();

我没有收到任何错误,但也没有收到预期的结果。无论如何,我尝试在终端中直接运行相同的命令,并且一切正常。
我错过了什么吗?

提前致谢

4

2 回答 2

4

当您启动一个进程 ( pb.start()) 时,您将返回一个Process实例。如果您的脚本读取输入或将输出写入 stdout 或 stderr,您需要在单独的线程上使用Process.getInputStream(),...getOutputStream()getErrorStream(). 如果您不这样做,该过程可能会挂起。您还应该调用Process.waitFor()thenProcess.exitValue()来获取进程的返回状态。如果它是负数,则系统无法启动您的脚本。

编辑:这是一个简短的简化示例。这只是一个玩具,只有在以下条件下才能可靠地工作:

  1. 该脚本不需要任何输入

  2. 该脚本不会在 stdout 和 stderr 上产生大量输出。如果是这样,那么由于程序在 stderr 之前读取所有 stdout,stderr 缓冲区可能会填满并阻止进程完成。在“真实”实现中,您将在单独的线程中读取 stdout 和 stderr(提示,将loadStream()方法包装在实现的类中Runnable)。

 

public class PBTest
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder("sc","query","wuauserv");
        Process p = pb.start();
        String output = loadStream(p.getInputStream());
        String error  = loadStream(p.getErrorStream());
        int rc = p.waitFor();
        System.out.println("Process ended with rc=" + rc);
        System.out.println("\nStandard Output:\n");
        System.out.println(output);
        System.out.println("\nStandard Error:\n");
        System.out.println(error);
    }

    private static String loadStream(InputStream s) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(s));
        StringBuilder sb = new StringBuilder();
        String line;
        while((line=br.readLine()) != null)
            sb.append(line).append("\n");
        return sb.toString();
    }
}
于 2010-11-19T21:24:42.990 回答
2

问题不在于我调用脚本的方式,这是正确的。
但它在剧本里面。一开始是这样的:

#!/bin/bash
inputFolder=$1
outputFolder=$2 

cd $inputFolder

for file in `ls ` ; do
ffmpeg -i $inputFolder/$file -ar 22050 $outputFolder/$file.mp4 
done

但是我得到了ffmpeg command not found,所以我将其更改为:

#!/bin/bash
inputFolder=$1
outputFolder=$2 

cd $inputFolder

for file in `ls ` ; do
/usr/local/bin/ffmpeg -i $inputFolder/$file -ar 22050 $outputFolder/$file.mp4 
done  

与孔路径。但是我仍然有疑问,为什么这是必要的,如果我的路径中有 ffmpeg 并且我可以在控制台直接从任何目录执行?如果有人可以给我一个答案,那将是受欢迎的:)

于 2010-11-23T10:25:14.560 回答