Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中执行linux命令并将输出存储在变量中_Java_Linux - Fatal编程技术网

在java中执行linux命令并将输出存储在变量中

在java中执行linux命令并将输出存储在变量中,java,linux,Java,Linux,我想在我的java程序中获得媒体服务器上的全部免费E1通道。我使用以下代码获得了我想要的结果: String command = "asterisk -rx " + '"' + "ss7 linestat " + '"' + " |grep " + '"' + "Idle" + '"' + " |wc -l"; Process p = Runtime.getRuntime().exec(command); p.waitFor(); BufferedReader buf = new Buffere

我想在我的java程序中获得媒体服务器上的全部免费E1通道。我使用以下代码获得了我想要的结果:

String command = "asterisk -rx " + '"' + "ss7 linestat " + '"' + " |grep " + '"' + "Idle" + '"' + " |wc -l";
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = buf.readLine()) != null)


    {
        freeE1s += line + "\n";
    }            

System.out.println(freeE1s);
当我在LinuxShell中使用kitty执行上述命令时,它工作正常并返回count,但当我使用这个jar时,我得到了异常。我通过日志记录调试代码,发现buf.readLine()返回null

编辑1:


不要担心异常。它只是将输出解析为整数,这导致了异常。实际上,问题是当我记录buf.readlin()时,它返回了null,当然不能解析为int。

首先,不要使用Runtime.exec。始终使用,它具有更可靠和可预测的行为

其次,字符串中的所有内容都作为单个命令传递,包括竖条。您没有将其传递给shell(如/bin/bash),因此将命令传递给另一个shell将不起作用

第三,您需要在命令运行时使用它的输出。如果调用
waitFor()
,然后尝试读取输出,它有时可能会工作,但在大多数情况下也会失败。这种行为高度依赖于操作系统,甚至在不同的Linux和Unix内核和外壳之间可能有所不同

最后,您不需要
grep
wc
。你有Java。在Java中做同样的事情非常容易(而且可能比试图调用shell以便管道工作更容易):

从Java 8开始,您可以将其缩短:

ProcessBuilder builder =
    new ProcessBuilder("asterisk", "-rx", "ss7 linestat");
builder.inheritIO().redirectOutput(ProcessBuilder.Redirect.PIPE);
Process p = builder.start();

long freeE1s;
try (BufferedReader buf =
        new BufferedReader(new InputStreamReader(p.getInputStream()))) {
    freeE1s = buf.lines().filter(line -> line.contains("Idle")).count();
}

p.waitFor();

System.out.println(freeE1s);

您能提供您收到的异常吗?事实上,异常是在将结果解析为int时发生的,因为上面的命令应该返回int值,所以我正在将结果解析为int,这会导致异常,但这件事呢2015-06-03 23:06:51419 DEBUG buf.readLine():null
ProcessBuilder builder =
    new ProcessBuilder("asterisk", "-rx", "ss7 linestat");
builder.inheritIO().redirectOutput(ProcessBuilder.Redirect.PIPE);
Process p = builder.start();

long freeE1s;
try (BufferedReader buf =
        new BufferedReader(new InputStreamReader(p.getInputStream()))) {
    freeE1s = buf.lines().filter(line -> line.contains("Idle")).count();
}

p.waitFor();

System.out.println(freeE1s);