Когда я выполняю команду в отдельном процессе, например, с помощью метода Runtime.getRuntime().exec(...)
, чей JavaDoc сообщает:
Executes the specified command and arguments in a separate process.
Что мне нужно сделать с потоками из этого процесса, зная, что процесс будет жить до тех пор, пока не будет создана Java-программа? (это деталь, но Java-программа заботится о том, чтобы убить этот процесс, и сам процесс имеет встроенную систему безопасности, где он убивает себя, если заметит, что Java-программа, которая породила его, больше не работает).
Если мы считаем, что этот процесс вообще не производит вывода (например, потому что все сообщения об ошибках и стандартный вывод перенаправляются в / dev / null и все коммуникации осуществляются с использованием файлов / сокетов / чего угодно), что мне нужно делать с входной поток?
Должен ли я иметь один (или два?) Потока Java, работающие даром, пытаясь прочитать stdout / stderr?
Как правильно обращаться с долгоживущим внешним процессом, порожденным из Java-программы, которая вообще не производит stdout / stderr?
EDIT
По сути, я обертываю сценарий оболочки в другой сценарий оболочки, который обязательно перенаправляет все в / dev / null . Я почти уверен, что мой Un * x был бы несовместим, если бы мой «внешний» сценарий оболочки (тот, который перенаправляет все в / dev / null) все равно генерировал бы что-либо на stdout или stderr . И все же я считаю ошеломляющим, что у меня как-то должны быть потоки, запущенные в течение жизненного цикла приложения "на пустую голову". Действительно уму непостижимо.