我正在使用filebeat来读取一些日志文件,我需要使用Java程序启动filebeat。 filebeat命令使用Windows PowerShell执行。我使用了以下代码,但它没有用。
try {
ProcessBuilder b1 = new ProcessBuilder("powershell.exe", "/c", "cd \"C:\\Program Files\\Filebeat\" && ./filebeat -e -c filebeat.yml -d \"publish\"\\");
b1.redirectErrorStream(true);
Process p1 = b1.start();
BufferedReader r1 = new BufferedReader(new InputStreamReader(p1.getInputStream()));
String line1;
while (true) {
line1 = r1.readLine();
if (line1 == null) { break; }
System.out.println(line1);
}
} catch(Exception e) {
}
答案 0 :(得分:0)
您将PowerShell与CMD混为一谈。后者有一个参数/c
,前者没有。{另外,不要在comandline中使用cd
,而应该只在ProcessBuilder
对象上设置工作目录,并且命令行的每个标记应该是一个单独的数组元素。
将您的代码更改为类似的内容,它应该按预期执行:
ProcessBuilder b1 = new ProcessBuilder("cmd.exe", "/c", "filebeat", "-e", "-c", "filebeat.yml", "-d", "\"publish\"");
b1.directory(new File("C:\\Program Files\\Filebeat"));
b1.redirectErrorStream(true);
Process p1 = b1.start();
答案 1 :(得分:0)
以下代码有效。
ProcessBuilder pb = new ProcessBuilder("C:\\Program Files\\Filebeat\\filebeat.exe", "-c", "C:\\Program Files\\Filebeat\\filebeat.yml", "-e");
pb.redirectErrorStream(true);
Process p = pb.start();
BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = bri.readLine()) != null) {
System.out.println(line);
}
p.waitFor();