Запустить процесс, не используя его вывод - PullRequest
1 голос
/ 04 января 2012

Я использовал эту строку для выполнения скрипта Python из Java-приложения:

Process process = Runtime.getRuntime().exec("python foo.py", null, directory);

Скрипт запускает TCP-сервер, который связывается с моим Java-приложением и другими клиентами.

Когда яотлаживал сценарий, у меня было несколько отпечатков консоли тут и там, и все было хорошо.Как только скрипт был запущен из Java Code, мой TCP-сервер через определенное время не отвечал.После некоторого времени отладки и разочарований я удалил свои отпечатки из сценария, и все заработало как положено.

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

Как запустить процесс, чтобы мне не приходилось использовать стандартный поток вывода?Я хотел бы сохранить распечатки для отладки, но не хочу запускать поток, который читает поток, который мне не нужен.

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Вы должны использовать выходные данные дочернего процесса, или в итоге он заблокируется, потому что буфер вывода заполнен (не забывайте и о stderr).Если вы не хотите изменять свою Java-программу так, чтобы она использовалась, возможно, вы могли бы добавить флаг к вашему сценарию, чтобы полностью отключить отладку, или, по крайней мере, направить его в файл (который может быть /dev/null).

1 голос
/ 04 января 2012

Java предоставляет ProcessBuilder.Это то, что вы можете использовать, чтобы выполнить то, что вы хотите.Это делает fork-exec, а также позволяет обрабатывать потоки вывода и ошибок.

Тот факт, что ваш процесс зависает не из-за Java.Это стандартная проблема, когда ваш процесс заблокирован, потому что поток заполнен, и никто его не использует.

Попробуйте использовать ProcessBuilder с потоком, который читает потоки.

0 голосов
/ 04 января 2012

В прошлом я делал нечто подобное и перенаправляю выход процесса в определенный файл журнала, относящийся к процессу.Позже вы могли видеть, что происходит.И вы могли бы поддерживать свой след вашего скрипта Python.

...