Как выйти из программы, работающей на сервере Morbo или Hypnotoad
В программах, работающих под сервером Morbo (и Hypnotoad) вызов exit()
молча игнорируется и эффективно работает как возврат из обратного вызова. Блок END срабатывает как обычно, но сама программа никогда не завершается.
#!/usr/bin/perl
use Modern::Perl;
use Mojolicious::Lite;
END {
say "END block";
}
Mojo::IOLoop->timer(5 => sub {
say "Sleeping...";
sleep 15;
say "Before...";
exit(1);
say "Never seen";
});
app->start;
$ morbo test.pl
Server available at http://127.0.0.1:3000
Sleeping...
Before...
END block
^C
0 ответов
При запуске приложения Mojolicious может произойти что-то плохое (нет подключения к базе данных). Я решил изменить корневой URL-адрес своего приложения.
В Myapp.pm:
sub startup {
my $app = shift;
$app->plugin('Config');
...
my $r = $app->routes;
$r->get('/')->to('root#index')->name('root');
eval {
$app->check_important_things_which_can_die;
};
if ($@) {
$r->find('root')->remove;
$r->get('/')->to('Error::Root#index')->name('error_root');
}
Я не знаю, работает ли это в работающем приложении после использования маршрутизации.
Вы можете оформить kill
к идентификатору родительского процесса из вашего обработчика:
system "kill -s INT " . getppid();
Это корректно завершит серверный процесс, убивая всех запущенных рабочих процессов. Также работает для Hypnotoad.