2012-05-19 2 views
2

Это не первый раз, когда я пытался выполнить системную команду из Java; но на этот раз это оказывается очень тяжело. У меня есть сценарий, который отлично работает с терминалом. Он считывает данные из файла (input.txt), обрабатывает его и экспортирует результат в другой файл (ouput.txt). Все это длится не более 1 секунды. Но, когда я пытаюсь выполнить его с Java, он застревает и никогда не заканчивается. Это мой код:Java не может выполнить системную команду (Ubuntu)

Process p = new ProcessBuilder("./runCalculator.sh").start(); 
p.waitFor(); 

Я также попытался с Runtime.getRuntime().exec("./runCalculator.sh"), но все-таки. Я прочитал как InputStream, так и ErrorStream этого процесса. Поток ошибок не возвращает ничего, кроме сообщения «Начальный расчет ...»

Любые идеи?

ответ

4

Вы должны использовать следующий код:

ProcessBuilder pb = new ProcessBuilder(); 
pb.command("bash", "-c", "./runCalculator.sh"); 
Process process = pb.start(); 
int retValue = process.waitFor(); 
+0

Спасибо, это сработало для меня! Но почему? –

+1

Потому что вы должны фактически запустить «bash» (или «sh»), который является интерпретатором. И вы передаете команду, которую хотите выполнить (для bash это передается с помощью опции '-c') –

+0

@Pantelis ваш исходный код работал бы, если файл, который вы передали в ProcessBuilder ctr, был исполняемым файлом. Поскольку это был сценарий оболочки runCalculator.sh, оболочка (bash или sh) является исполняемым программным файлом, необходимым для интерпретации команд сценария оболочки и запуска их. В командной строке запустите $ file/usr/bin/bash и сравните вывод с запуском $ file ./runCalculator.sh –

3

Для этого вам, вероятно, потребуется вызвать интерпретатор/процессор команды unix. См.: When Runtime.exec() won't.

3

Попробуйте это:

Process p = new ProcessBuilder("sh ./runCalculator.sh").start(); 
0

Другой, проще решение, что вы можете открыть программу, введя имя программы (это предполагает, что программа установлена) вместо создания скрипта и вызова его.

Обратите внимание, что название программы не всегда совпадает с тем, что вы видите в меню Gnome, например, калькулятор Gnome является «gnome-calculator».

Что касается данных фактов, вы можете запустить калькулятор по линии на следующей:

Process p = Runtime.getRuntime().exec("gnome-calculator"); 

В этом случае у вас нет необходимости в каких-либо скрипты Sh (в вашем случае runCalculator.sh).

Смежные вопросы