linux上的Java运行命令管道
我正在尝试在linux环境中获得管道命令的输出,但到目前为止运气不佳linux上的Java运行命令管道,java,linux,command,pipe,Java,Linux,Command,Pipe,我正在尝试在linux环境中获得管道命令的输出,但到目前为止运气不佳 ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "top", "-b", "-n", "2", "-d", "0.2", "-p", pid + "", "
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "top", "-b", "-n", "2", "-d", "0.2", "-p", pid + "", "|", "tail", "-1", "|", "awk", "'{print $6}'");
pb.redirectErrorStream(true);
Process p = pb.start();
p.getOutputStream().close();
try (InputStream is = p.getInputStream()) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
String line = br.readLine();
System.out.println(line);
}
}
此输出:top:tty get失败
当我尝试在不指定脚本执行器/bin/bash-c:top:unknown选项“|”的情况下执行时,shell命令应该是在-c之后传递的单个参数。被调用的shell将负责管道和标记化:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c",
"top -b -n 2 -d 0.2 -p " + pid + " | tail -1 | awk '{print $6}'");
为了获得健壮性的好处,可以将变量作为单独的参数传递,而不是像在SQL中使用准备好的语句那样将它们注入字符串:
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c",
"top -b -n 2 -d 0.2 -p \"$1\" | tail -1 | awk '{print $6}'", "_", String.valueOf(pid));
当pid是整数时没有区别,但如果它是任意字符串,这将提高安全性和健壮性。没有使用process builder,因此我无法说明所有这些标志都在做什么。但这是一些复杂的事情。我很有信心tty get失败的错误是因为您试图以非交互式方式运行交互式程序top。Top想要抓住tty,这样它就可以绘制整个屏幕。你正在以一种它无法绘制屏幕的方式运行它。希望有帮助。