【问题标题】:How to exit a program running under a Morbo or Hypnotoad server如何退出在 Morbo 或 Hypnotoad 服务器下运行的程序
【发布时间】:2018-05-25 04:17:29
【问题描述】:

在 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 

【问题讨论】:

  • 程序确实退出了。 morbo 仍在运行。
  • ...所以你问的是如何杀死父进程。

标签: perl mojolicious-lite hypnotoad morbo


【解决方案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');
    }

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

【讨论】:

    【解决方案2】:

    您可以在处理程序中向parent process ID 发出kill

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      相关资源
      最近更新 更多