Как перезапустить сценарий Perl, работающий под mod_fcgid, после изменения?

StackOverflow https://stackoverflow.com//questions/9675286

  •  12-12-2019
  •  | 
  •  

Вопрос

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

Под mod_fastcgi, вы можете настроить

FastCgiConfig -autoUpdate

сделать именно это, но mod_fcgid нет такой возможности.У кого-нибудь есть хороший обходной путь для этого?

Лучшее, что я придумал, это:

while (my $cgi = CGI::Fast->new()) {
    processRequest($cgi);
    exit if -M $0 < 0;  # restart if script changed
}

который завершается после обработки еще одного запроса.Но это не идеально, особенно если запущено несколько экземпляров сценария, может пройти немало времени, прежде чем все старые экземпляры смогут запуститься еще раз и завершить работу.

Если я сделаю exit до processRequest, пользователь получает ошибку, так что это тоже не поможет.

Заранее спасибо,

- Майкл

Это было полезно?

Решение

Правильный способ сделать это немного тонкий.Я бы рекомендовал посмотреть Plack::Loader::Restarter о том, как это сделать, или, что еще лучше, адаптировать ваше приложение для работы на Plack, а затем просто запустить его с помощью plackup. -r возможность автоматической загрузки перезапускателя.Адаптировать ваше приложение может оказаться проще, чем вы ожидаете, возможно, так же просто, как изменить

use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
    processRequest($cgi);
}

к

use CGI::Emulate::PSGI;
use CGI;

my $app = CGI::Emulate::PSGI->handler(sub {
    my $cgi = CGI->new;
    processRequest($cgi);
});

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

Другие советы

Я вообще не пробовал, но хотел бы Module::Refresh работать для своего mod_fcgid цели?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top