gpt4 book ai didi

java - 问题 ProcessBuilder 运行脚本 sh

转载 作者:行者123 更新时间:2023-11-29 07:21:13 25 4
gpt4 key购买 nike

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

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

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

提前致谢

最佳答案

当你启动一个进程(pb.start())时,你会得到一个Process实例。如果您的脚本读取输入或将输出写入 stdout 或 stderr,您需要使用 Process.getInputStream()...getOutputStream() 在单独的线程上处理此问题>getErrorStream()。如果您不这样做,该过程可能会挂起。您还应该调用 Process.waitFor(),然后调用 Process.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();
}
}

关于java - 问题 ProcessBuilder 运行脚本 sh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4225663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com