3

在 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 
4

2 回答 2

1

启动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');
    }

在使用路由后,我不知道这是否适用于正在运行的应用程序。

于 2019-10-12T15:29:34.860 回答
0

您可以从 Handlerkill中向父进程 ID发出一个:

system "kill -s INT " . getppid();

这将优雅地退出服务器进程,杀死所有已启动的工作人员。也适用于催眠蟾蜍。

于 2019-10-16T21:52:15.060 回答