Как выйти из программы, работающей на сервере 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.

Другие вопросы по тегам