Java ProcessBuilder не выполняет команду, но также не возвращает ошибку

#java #processbuilder #oggvorbis

#java #processbuilder #oggvorbis

Вопрос:

Выполнение следующего кода отлично работает на моем компьютере, но не работает при запуске 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-программ. Моя цель сейчас — отредактировать vorbis-теги, используя утилиту командной строки unix vorbiscomment и Java ProcessBuilder. Код работает на моем компьютере, что заставляет меня думать, что это может иметь какое-то отношение к разрешениям на сервере. Моя проблема в том, что я не получаю никаких выходных данных от 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();
  

который ничего не выводил.

Я был бы признателен за любую помощь.

Комментарии:

1. Удалите символы двойных кавычек из ваших аргументов. Это "artist=SomeArtist" . Заключение его в двойные кавычки необходимо для оболочки, а не для прямого выполнения.

Ответ №1:

Вы читаете из Process InputStream. Вы должны смотреть на Process.getErrorStream() или Process.getOutputStream() .

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

Вы также можете проверить значение exitValue, чтобы узнать, успешно ли завершен процесс.

Комментарии:

1. Хотя можно напрямую проверять InputStream и ErrorrStream, обычно проще оставить их в покое и вместо этого вызвать pb.inheritIO() , чтобы они отображались в стандартном выводе / ошибке процесса Java.

2. Process.getInputStream является ли стандартный вывод из процесса (ввод в java), и в целом его чтение является правильным, в то время .getOutputStream как является стандартным для процесса из java. Но добавление .getErrorStream , которое является stderr из процесса, действительно, вероятно, является ответом. Я бы проголосовал .5, если бы стек разрешил это.