Решение между Apache Commons exec или ProcessBuilder
Я пытаюсь решить, следует ли использовать ProcessBuilder
или Commons exec,
Мои требования заключаются в том, что я просто пытаюсь создать процесс демона, stdout/stdin/stderr которого меня не волнует. Кроме того, я хочу выполнить убийство, чтобы уничтожить этот процесс, когда придет время.
Я использую Java в Linux.
Я знаю, что у обоих есть свои боли и подводные камни (например, если использовать отдельный поток для проглатывания потоков, это может привести к блокировке или взаимоблокировкам и закрытию потоков, чтобы не оставлять открытые файлы в обход) и хотел узнать, были предложения в том или ином виде, а также любые хорошие ресурсы для подражания.
Ответы
Ответ 1
commons-exec - не лучшая библиотека, которую я когда-либо использовал, но она решает самую большую ошибку в вызове Java-процесса, которая правильно обрабатывает/потребляет stdout/sterr. Я использовал ProcessBuilder в прошлом, и это нормально, и commons-exec теперь тоже отлично и легко справляется с большинством обычных случаев.
Ответ 2
Библиотека ZT Process Executor является альтернативой Apache Commons Exec. Он имеет функциональность для запуска команд, захвата их вывода, тайм-аутов настройки и т.д.
Я еще не использовал его, но он выглядел достаточно хорошо документированным.
Пример из документации: Выполнение команды, перекачка stderr в регистратор, возвращение вывода в виде строки UTF8.
String output = new ProcessExecutor().command("java", "-version")
.redirectError(Slf4jStream.of(getClass()).asInfo())
.readOutput(true).execute()
.outputUTF8();
В его документации перечислены следующие преимущества перед Commons Exec:
- Улучшенная обработка потоков
- Чтение/запись в потоки
- Перенаправление stderr в stdout
- Улучшена обработка тайм-аутов
- Улучшена проверка кодов выхода
- Улучшенный API
- Один лайнер для довольно сложных приложений
- Один лайнер для вывода процесса в строку
- Доступ к объекту Процесс
- Поддержка асинхронных процессов (Будущее)
- Улучшен ведение журнала с помощью API SLF4J
- Поддержка нескольких процессов
Ответ 3
Если вы хотите использовать процесс демона, возможно, Apem Commons Daemon будет более подходящим?
Ответ 4
Commons Daemon выполняет работу по запуску Java-процесса как демона, но он не делает этого так, как этого можно было бы ожидать. Например, когда стандартная программа C запускает демона (например, apache или sshd), они выполняют некоторые проверки на проверку конфигурации и другие вещи (например, блокировку файла блокировки) перед тем, как развернуть их в фоновом режиме. Apache Commons Daemon - это c-программа, запускающая Java-приложение и не позволяющая вам вводить проверки здравомыслия в код Java AFAIK и, таким образом, ломает то, что я считаю важным средством для демонстрации.
Таким образом, если вы хотите внедрить пусковую установку демона, которая ведет себя аналогично sshd, apache и т.д., тогда я бы предложил commons exec.
Ответ 5
Может быть, мой https://github.com/vorburger/MariaDB4j/blob/master/mariaDB4j-core/src/main/java/ch/vorburger/exec/ManagedProcess.java может вас заинтересовать?