Выбор между Apache Commons exec или ProcessBuilder

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

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

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

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

6 ответов

Решение

commons-exec - не лучшая библиотека, которую я когда-либо использовал, но она решает самую большую ошибку в вызове процесса Java, которая правильно обрабатывает / использует stdout / sterr. В прошлом я использовал ProcessBuilder, что хорошо, и теперь commons-exec, который также хорош и легко обрабатывает большинство распространенных случаев.

Библиотека 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 на стандартный вывод
  • Улучшена обработка тайм-аутов
  • Улучшена проверка кодов выхода
  • Улучшенный API
    • Один лайнер для довольно сложных случаев
    • Один лайнер, чтобы получить вывод процесса в строку
    • Доступ к объекту Process доступен
    • Поддержка асинхронных процессов (Будущее)
  • Улучшено ведение журнала с SLF4J API
  • Поддержка нескольких процессов

Может быть, мой https://github.com/vorburger/MariaDB4j/blob/master/mariaDB4j-core/src/main/java/ch/vorburger/exec/ManagedProcess.java может вас заинтересовать?

Если вы хотите использовать процесс демона, возможно, Apache Commons Daemon будет более подходящим?

Commons Daemon выполняет работу по запуску процесса Java как демон, но он делает это не так, как следовало ожидать. Например, когда стандартная программа на C запускает демон (например, apache или sshd), они выполняют некоторые проверки работоспособности конфигурации и другие вещи (например, блокировку файла блокировки), прежде чем переходить в фоновый режим. Apache Commons Daemon - это программа переменного тока, которая запускает Java-приложение и не позволяет вам проверять работоспособность Java-кода AFAIK и, таким образом, нарушает то, что я считаю важными средствами демона.

Таким образом, если вы хотите реализовать средство запуска демона, которое ведет себя подобно sshd, apache и т. Д., То я бы предложил exec для commons.

Теперь вы можете легко выполнять большинство задач, используяProcessBuilder, а потребность в таких библиотеках, как ZT Process Executor или Commons Exec, уже не так велика.

Это здорово, потому что вместе с возможностью запуска Java-программ без отдельного шага компиляции (java SomeProgram.java), теперь вы можете использовать Java для задач сценариев оболочки.

Следующий код демонстрирует, как выполнить требования, указанные в вопросе:

      var process = new ProcessBuilder()
        .redirectError(Redirect.DISCARD)
        .redirectOutput(Redirect.DISCARD)
        .start();

if (!process.waitFor(10, TimeUnit.SECONDS)) {
    process.destroyForcibly();
}

if (process.exitValue() != 0) {
    // Handle error
}

Одна вещь, которая часто необходима для программ в стиле сценария оболочки, — это захват вывода внешней команды. Это все еще немного сложно в Java, но это можно сделать с помощью фрагмента в этом ответе .

Другие вопросы по тегам