apt-cache search <some query>
のように長時間実行するsystem
コマンドを使用している場合は、^C
経由で親のPerlプロセスに送信するSIGINT
をそのような方法で転送する方法がありますすべての子プロセスが収穫されるということです。Perl forward SIGINTを `system`コマンドから親プロセスに転送する
この例には、適切な動作がありません。シグナルは子プロセスに送られます。
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use autodie;
# long running command on ubuntu, produces a ton of output.
# replace with your favorite long running command
system("apt-cache search hi");
print("Perl did not catch SIGINT even with autodie\n");
私はsystem("apt-cache search hi &")
によって作成される子のPIDを獲得する方法を周りに検索しようとしたが、いずれかを見つけることができませんでしたので、私は、プロセスをINGのシグナルハンドラを書くfork
INGとexec
を試してみました。 apt-cache
自体がclone
システムコール経由でいくつかのプロセスを起動するため、これは機能しません。ハンドローリング私は私が欲しい、本質的に何を推測するプロセスツリーの一部を歩くと
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use autodie;
my $cpid;
$SIG{INT} = sub {
kill 'KILL', $cpid;
exit;
};
# long running command on ubuntu, produces a ton of output.
# replace with your favorite long running command
$cpid = fork;
if ($cpid == 0) {
exec 'apt-cache', 'search', 'hi';
}
print "Perl did not catch SIGINT even with autodie\n";
をクリーンアップするためにいくつかのロジックがsystem
が立ち上げた子プロセスが原因そうSIGINT
などの信号に出るかどうかを決定する方法のどちらかであります私は、Perlスクリプト自体を後にするか、子プロセスを歩いてプロセス管理の奇妙なケースがきれいに移植可能に処理されるようにすることができます。
'IPC :: Run'はシステムではなく、あなたが必要とするものです。あるいは、 'SIGCHLD'を" IGNORE "に設定すると、自動的に終了時に刈り取られます。 – Sobrique
コマンドがユーザーによってアボートされたかどうかを検出する方法は次のとおりです。[Signal number 2の名前](http://stackoverflow.com/questions/29862178/name-of-signal-number-2) –
も参照[独自のプロセスグループでプロセスを開始する方法は?](http://stackoverflow.com/questions/5809034/in-linux-how-to-start-a-process-in-its-own-process-group-そして - それ以上) –