2009-09-08 5 views
0

Это может показаться немного неудобным, но я хочу запустить консольную программу на Java, но в ее собственном окне, в то же время используя tee для сохранения вывода в файле журнала , Я переношу программу, которая делает это с Perl на Java, и у меня возникают проблемы с запуском программы с множеством командных команд. В Perl он используетЗапуск внешней программы в Java и конвейере ее вывод

system("dtterm -title $title -e /usr/bin/ksh -c \"". 
"cd $dir; ./$exec $arg | tee $exec.log \" &"); 

Я пытаюсь использовать класс ProcessBuilder для того же.

ProcessBuilder builder = new ProcessBuilder("dtterm", "-title", title, "-e", 
"/usr/bin/ksh", "-c" "./" + exec, arg, "|", "tee", exec + ".log"); 
builder.directory(dir); 
Process process = builder.start(); 

При этом, процесс начинается, это не труба в файл журнала, а также, но это не из Perl. Я попытался использовать метод builder.getInputStream(), но поскольку он отображается в окне dtterm, выход из процесса отсутствует.

Мне нужно иметь отдельные окна, потому что программа запускает несколько разных программ одновременно, каждый со своими окнами. Я попытался запустить его напрямую и отправить вывод из всех процессов в мою программу stdout, но было слишком много, его нужно сохранить отдельно. Если нет способа сделать это, мне придется сделать JFrame, который показывает выходные данные программ, но я хотел бы избежать этого, если это возможно.

Благодаря

ответ

1

Вы должны создать свою команду немного по-другому. Чего вы хотите:

dtterm -title <title> -e /usr/bin/ksh -c "./<exec> arg | tee <exec>.log" 

(обратите внимание на кавычки параметра ksh.) Вы должны повторить это в коде:

ProcessBuilder builder = new ProcessBuilder("dtterm", "-title", title, "-e", "/usr/bin/ksh", "-c", "./" + exec + " arg + " | tee " + exec + ".log"); 

Да, это выглядит очень некрасиво, и вы должны следите, чтобы избежать exec должным образом в случае, если он содержит специальные символы, такие как пробел или кавычки.

+0

Спасибо, это не совсем сработало, но привело меня к этому. Как и у вас, все после -c должно быть в 1 конкатенированной строке, но для строки не нужны кавычки. Я не знаю, почему это было замечено в другом процессе, где я указывал заголовок, у меня появился новый ProcessBuilder («exec», «-title», «\» название программы \ »), и название появилось с «на нем», вывел их, и он все еще работал. Может быть, java сохраняет все, как 1 agument dispite space в строке. –

+0

Вы правы, конечно. Java заботится о том, чтобы один параметр передавался программе в качестве одного параметра, кавычки не нужны. – Bombe

+0

Тем не менее вам все равно нужно избегать специальных символов. :) – Bombe

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