Как заставить сценарий оболочки перезапустить Java, если какой-либо поток падает?

У меня есть многопоточная Java-программа.

В идеале он должен запускаться один раз и успешно завершиться.

К сожалению, иногда происходит сбой одного из потоков, например, путемDivisionByZeroException,

Поскольку программа бесполезна, если не запущены все потоки, я хотел бы полностью перезапустить JVM (и программу) всякий раз, когда один из потоков не работает.

Вопрос: как мне написать скрипт оболочки, который бы это делал?

Псевдокод для сценария оболочки, который я ищу:

#bin/bash
while (true) {
   sudo java -jar MyProgram.jar
   if (MyProgram.terminatedWithoutExceptions) { // How to write this part?
       finish;
   } else {
       shutdown JVM;
   }
}

1 ответ

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

Ноль - "все прошло хорошо", все остальное - "проблемы с омгхастоном". Опять же, это просто соглашение. Некоторые вещи (например, grep -q ...) используйте код выхода, чтобы указать, было ли совпадение. Grep работал без ошибок, но он использует код выхода, чтобы сигнализировать что-то еще здесь.

Во всяком случае, я предполагаю, что если ваше Java-приложение взорвется до такой степени, что оно будет повреждено или что-то еще, оно не выйдет чисто. Таким образом, код выхода, который он отправляет обратно в родительскую оболочку, не равен нулю. Это действительно облегчает тестирование:

while true; do
    sudo java -jar MyProgram.jar
    if [ $? -eq 0 ]; then
        // it exited cleanly, do something good
    else
        // it crashed out, do something else
    fi
done

Если вы хотите выйти из цикла while в одном из этих выражений, вставьте break,

Действительно ли запуск Java-программы от имени root - отличная идея? Кто знает. Я не знаю, кто запускает этот внешний скрипт, так что на данный момент нет суждения, но рассмотрите возможность его рефакторинга, если можете.


Вышеприведенное является точным, но перечитывая ваш вопрос, вы можете изменить способ объединения ваших тем. Прошло ~13 лет с тех пор, как я выполнял какую-то работу с потоками в Java, и это было чисто академическим, но со мной произошел ряд вещей:

  • Проблемы деления на ноль можно избежать, проверяя входные данные.
  • Они также ловимы. Не позволяйте им разбить нить. Поймай, войди и двигайся дальше.
  • Бегунок потока, который позволяет сбоям потоков без запуска нового, является мусорным. Найдите что-то более надежное.

Лучшее решение не будет убирать, когда что-то пойдет не так, это будет мешать им зайти так далеко во-первых. Это может быть сделано.

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