Подтвердить что ты не робот

Решение между Apache Commons exec или ProcessBuilder

Я пытаюсь решить, следует ли использовать ProcessBuilder или Commons exec,

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

Я использую Java в Linux.

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

4b9b3361

Ответ 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.