#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, если бы стек разрешил это.