AnyEvent と EV を使用していくつかのコードを実装しようとしています。チャイルドウォッチャーをインストールしたい(以下のやりたいことのモックアップ)
use Modern::Perl;
use AnyEvent;
use EV;
my $SIG{QUIT} = \&kill_child;
my $exit_status = undef;
my $pid = fork or exec 'child.pl';
my $w = AnyEvent->child(pid => $pid, cb => sub { $exit_status = $_[2]; cleanup_after_child(); });
my $t = AE::timer 0, 5, sub { say $exit_status; fork_another_process(); };
AnyEvent->condvar->recv;
sub kill_child{
foreach my $signal (qw(HUP QUIT INT KILL)){
if(child_alive()){
kill($signal,$pid);
sleep 1;
}
}
exit; #Probably wrong
}
child_alive() の作成と、さまざまなコールバックのタイミングの把握、および kill_child() での終了の配置について、助けが必要です。プロセスが終了する前に cleanup_after_child() が呼び出されるようにする必要があります。
AnyEvent Signal ウォッチャーを使用すると役立ちますか? 私の目標は、最初にプロセスの子プロセスを強制終了し、その後クリーンアップすることで、デーモン プロセスを安全にシャットダウンできるようにすることです。以前に関連する質問 ( perl での子プロセスの待機中) を行いましたが、終了処理中にそのバグが発生するのを防ぎたいと考えています。
ありがとう
編集: child_alive() 関数に対して次のように機能しますか?
sub child_alive{
return defined($exit_status)?1:0;
}
言い換えれば、コールバックは子が終了するとすでに呼び出されているのでしょうか、それともコールバックは EventLoop の次の繰り返しでのみ実行されるのでしょうか? もしそうなら、すべてのシグナルが処理された後にのみ終了するにはどうすればよいですか? 次のようなすべてのイベントを削除するだけですか。
$w = undef;
$t = undef;
申し訳ありませんが、信号が一般的にどのように機能するかよりも、AnyEvent がこれらの信号をどのように処理するかを理解しようとしています。