Прежде всего, я согласен с предыдущими постерами и комментаторами - обычно, вы не должны получать ошибки в этой ситуации, и правильное исправление - выяснить, почему это ошибки и исправления (вполне может быть ошибкой библиотеки, так какДжонатан сказал).
ОДНАКО, чтобы ответить на ваш прямой технический вопрос, вы НЕ МОЖЕТЕ восстановить интерпретатор Perl (или любую другую программу для этого материала), как только он выйдет из строя.В любом случае, вы не ХОТИТЕ ХОЧЕТСЯ - скорее всего, в грязном состоянии.
Поэтому вы решаете свою проблему с помощью «резервного» механизма второго процесса, готового собрать разбитые фрагменты и убедиться, что шоу продолжается, следующим образом:
Непосредственно перед попыткой соединения с БД вы отключаете дочерний процесс.
Обратите внимание, что вам может потребоваться демонизировать дочерний процесс сразу после разветвления, поскольку смерть родителей может убить ребенка.Сейчас около 2 часов ночи, поэтому мой мозг слишком спит, чтобы быть уверенным, так это или нет.Если это так, то демонизация неоднократно описывалась в SO.
Родительский процесс пытается подключиться к БД, по тайм-ауту по стандартному сигналу Perl (установлен наскажем, 10 секунд или все, что вы хотите).
Если соединение было успешным, оно отправляет дочернему сигнал, чтобы указать, что соединение с БД в порядке, и родительский код может продолжаться как обычно.
В случае сбоя соединения родительский узел либо выполняет coredumps, либо выдает die
, предполагая, что соединение не было выполнено не coredump или истекло время ожидания.
ChildПроцесс, сразу после разветвления, устанавливает обработчик сигнала для перехвата родительского сигнала «Соединение с БД установлено успешно», а затем устанавливает тревогу на 10 + epsilon секунд.
Если дочерний процесс перехватывает родительский сигнал «Соединение с БД установлено успешно», дочерний процесс умирает.
С другой стороны, если сработал обработчик тревоги дочернего процесса, это означает, что родитель не может«тподключиться к БД.Поэтому дочерний процесс отправляет родителю сигнал «Я собираюсь выполнить аварийное переключение»;и затем выполнить логику переключения при необходимости
Вышеприведенная логика очень грубая, возможно, ее необходимо усовершенствовать, чтобы справиться с условиями гонки, возможно, из-за блокировки, полученной обоимиобрабатывает перед использованием данных.
ОБНОВЛЕНИЕ
Как отмечено в комментариях, вариант выше, где процесс CHILD пытается установить соединение с БД и родительский процессловит проблемы и действует как запасной вариант, который может быть несколько проще реализовать.