Выход программы на Java и отсоединение от переднего плана - PullRequest
3 голосов
/ 11 октября 2010

У меня есть java-программа, скажем, Test.class.

Когда я выполняю java Test, программа запрашивает пароль и затем продолжает.

Проблема в том, что stdout перенаправленв журнал, и программа запускается с & (мы находимся в UNIX).

Как я могу взаимодействовать с этой программой, запущенной java Test & с stdin и stdout?

Одно из возможных решенийэто запустить программу на переднем плане, а затем после условия запустить его в фоновом режиме из Java.

Спасибо!

Ответы [ 4 ]

1 голос
/ 11 октября 2010

Если программа может считывать пароль из stdin, вы можете запросить пароль в сценарии Unix, затем запустить приложение Java и передать ему пароль, например:

echo $PASSWORD | java Test >log.out &

Или вы можетерассмотрите возможность разделения вашего Java-приложения на две части;может существовать одна интерактивная часть «переднего плана», которая проверяет пароль, а затем, когда пароль проверен, это может запустить «заднюю часть» в качестве фонового процесса и завершиться.

0 голосов
/ 12 октября 2010

На самом деле, если вы хотите иметь возможность только ввести пароль, возможно, вы можете попробовать запустить приложение на переднем плане (без завершающего символа &).

Затем, после того, как вы ввели пароль, нажмите Ctrl + Z или в другой оболочке выполните kill -SIGSTP <pid>, чтобы приостановить вашу программу. Наконец, введите bg, чтобы поместить его в фоновом режиме.

Для получения подробной информации ознакомьтесь с документацией о функции управления заданиями вашей оболочки.

0 голосов
/ 12 октября 2010

Я не вижу ничего специфичного для Java в этом вопросе, если вы хотите управлять stdin на основе вывода приложения, вы можете использовать утилиту Expect: http://en.wikipedia.org/wiki/Expect

Но будьте осторожны, Expect, как известно, очень хрупкий, вы бы посоветовали воздержаться от его использования в производственных сценариях.

0 голосов
/ 11 октября 2010

Один из вариантов - перенаправить ввод в вашу программу, используя echo s как:

(echo input1
 echo input2
 ....
) | java Test >& logfile &

В качестве альтернативы, если количество входов велико, вы также можете поместить свои входные данные в файл и перенаправить файл.содержание как:

< input_file java Test >& logfile &
...