Как перезапустить Perl-скрипт, работающий под mod_fcgid при изменении? - PullRequest
1 голос
/ 13 марта 2012

Я запускаю некоторые скрипты 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 пользователь получает сообщение об ошибке, поэтому он тоже ничего не сделает.

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

- Майкл

Ответы [ 2 ]

4 голосов
/ 20 марта 2012

Правильный способ сделать это немного тонко.Я бы порекомендовал посмотреть 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 еще приятнее, но эта версия спасает васот переписывания большей части вашего приложения).

2 голосов
/ 13 марта 2012

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

...