【问题标题】:Java ProcessBuilder is not executing command but also doesn't return an errorJava ProcessBuilder 没有执行命令,但也没有返回错误
【发布时间】:2019-09-03 14:25:59
【问题描述】:

在我的电脑上运行以下代码可以正常工作,但在我的服务器上由 nginx-clojure 运行时却不行。

ProcessBuilder pb = new ProcessBuilder("/usr/bin/vorbiscomment", "-w", "-t", "\"title=MySong\"", "-t", "\"artist=SomeArtist\"", "\"/media/music/SomeArtist/MySong.ogg\"");

背景:

我正在为一个与音乐相关的项目开发 REST API。它使用 nginx 模块 (nginx-clojure) 来嵌入 Java 程序。我现在的目标是使用 unix 命令行实用程序 vorbiscomment 和 Java ProcessBuilder 编辑 vorbis-tags。该代码确实可以在我的电脑上运行,这让我相信它可能与服务器上的权限有关。我的问题是我没有从 ProcessBuilder 获得任何输出,表明命令失败。我试过了:

Process proc = pb.start();

BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null)
{
    sb.append(line).append('\n');
}
return sb.toString();

没有输出任何东西。

我将不胜感激。

【问题讨论】:

  • 从参数中删除双引号字符。这是"artist=SomeArtist"。 shell需要用双引号括起来,而不是直接执行。

标签: java processbuilder oggvorbis


【解决方案1】:

您正在从Process 的输入流中读取数据。你应该看看 Process.getErrorStream()Process.getOutputStream()

https://docs.oracle.com/javase/7/docs/api/java/lang/Process.html

您还可以检查exitValue 以查看该过程是否成功完成。

【讨论】:

  • 虽然可以直接检查 InputStream 和 ErrorrStream,但通常更容易不理会它们,而是调用 pb.inheritIO(),以使它们显示在 Java 进程的标准输出/错误中。跨度>
  • Process.getInputStream 是进程的标准输出(java 的输入),通常读取它是正确的,而 .getOutputStream 是进程 from java 的标准输入。但是添加.getErrorStream 是过程中的stderr 确实可能是答案。如果 Stack 允许,我会投票 +.5。
猜你喜欢
  • 2020-06-11
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多