В чем разница между вызовом скрипта из оболочки / терминала и использованием процессов Java? - PullRequest
0 голосов
/ 28 марта 2012

У меня были реальные проблемы при попытке запустить скрипт ruby ​​через Java.У меня были предложены всевозможные решения, и все они почему-то терпят неудачу, поэтому я пытаюсь упростить мою проблему.

Допустим, у меня есть сценарий оболочки, в котором есть только эта строка:

ruby -rubygems script/test_s2t.rb

На терминале я могу запустить этот скрипт, используя script/runruby.sh, и он работает как положено.Теперь предположим, что у меня есть метод Java, который выполняет следующие действия:

String[] cmd = {"script/runruby.sh"};
ProcessBuilder builder = new ProcessBuilder(cmd);
builder.redirectErrorStream(true);
Process process = builder.start();

Это не работает (в частности, он возвращает ошибку из сценария Ruby, но это ошибочное направление, потому что оно действительно сводится ксам скрипт не работает должным образом).Мой вопрос не в том, почему этот сценарий test_s2t.rb не работает, потому что я думаю, что это может отвлекать меня от реальной проблемы.

Мой вопрос просто , что отличается, когда я запускаю что-то через ProcessBuilderв отличие от простого запуска через командную строку .Это проблема с разрешениями?Различия в пути?Должно быть что-то извилистое в среде, в которой запускается скрипт, потому что я не вижу проблемы с самим скриптом.

Как и всегда, любые предложения приветствуются.Три дня, и я рассчитываю на эту проблему ...

РЕДАКТИРОВАТЬ - Для любопытных точная ошибка, которую я получаю в Java, описана в нижней части этого вопроса: Java получает ошибку при выполнении сценария Ruby;Терминал не

Результат, который мы получили в этом вопросе, состоял в том, что я должен попробовать JRuby, но это привело к дальнейшим проблемам, так как я не могу заставить гем работать должным образом в JRuby.Поэтому я снова спросил себя, почему он не работает нормально.

Причина, по которой я считаю, что ошибка отвлекает, заключается в том, что ошибка дается просто потому, что она обработала строку, которой не былоожидая увидеть.Ожидаемая строка - это обычный процесс, который запускает скрипт, использующий ffmpeg и подобные.Это означает, что скрипт столкнулся с другой ошибкой (которую он не показывает, что означает, что он, вероятно, был вызван не ruby ​​/ jruby, а процессами, которые скрипт запускает как ffmpeg).

Это невероятно расстраивает,только потому, что он отлично работает из командной строки.

1 Ответ

2 голосов
/ 28 марта 2012

Я столкнулся с похожими проблемами, и есть две вещи, которые кажутся общими:

1) Среда дочернего процесса будет такой же, как среда текущей виртуальной машины. Это включает в себя рабочий каталог запущенного процесса.

Пример из: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html

Map<String, String> env = pb.environment();
env.put("VAR1", "myValue");
env.remove("OTHERVAR");
env.put("VAR2", env.get("VAR1") + "suffix");
pb.directory("myDir");

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

2) У тебя есть правильный шебанг #! в начале файла .sh? Лично я бы сделал это совершенно ясно и, возможно, явно вызвал бы bash или zsh или что-то еще с указанием пути к сценарию оболочки в качестве первого аргумента ИЛИ напрямую вызывал бы ruby ​​с аргументами '-rubygems' и 'script / test_s2t.rb' в качестве аргументов.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...