Как перезапустить сценарий Perl, работающий под mod_fcgid, после изменения?
Вопрос
Я запускаю несколько сценариев 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
цели?