独自の子を作成する非同期子プロセスを実行するソリューションを探しています。
通常、孫プロセスはシェル コマンドを実行し、その結果が子プロセスに返されます。
Forks::Super
他にも面白い機能があるので使ってみたいです。
以下のコードは機能しますが、子の一時ファイルを削除できなかったという警告が表示されます。
私は何を間違っていますか?
use Forks::Super ':all';
$Forks::Super::CHILD_FORK_OK = 1;
use Proc::ProcessTable;
my %result;
for (;;) {
$cnt++;
if (($cnt %= 5) eq 0) { #Start child if modulo 5 eq 0 (demo trigger)
$child_pid = fork { sub => \&startChild };
$result{$child_pid} = undef; # We use only the hash key as identifier, the value is reserved for later usage
}
for my $pnt (sort keys %result) { #maintain our internal process hash
if (!&checkProcess($pnt)) { #check our running childs
print "PID $pnt has gone\n";
delete $result{$pnt};
}
}
sleep 1;
} #endless
sub startChild {
print "Starting Child $$\n";
tie my @output, 'Forks::Super::bg_qx', qq["date"];
sleep 2 + rand 7;
print "Result was $output[0]\n";
print "End Child $$\n";
}
sub checkProcess {
$tobj = new Proc::ProcessTable;
$proctable = $tobj->table();
for (@$proctable) {
if ($_->pid eq $_[0]) {
print "Found Child with PID $_[0]\n";
return 1;
}
}
return undef;
}
出力はコメント フィールドが長すぎます。最近のエラー行は次のとおりです。
Child 2767 had temp files!
/usr/local/dev/threading/.fhfork2767/README.txt
/usr/local/dev/threading/.fhfork2767/.fh_001
/usr/local/dev/threading/.fhfork2767/.fh_002.signal
/usr/local/dev/threading/.fhfork2767/.fh_003
/usr/local/dev/threading/.fhfork2767/.fh_004.signal
at /usr/local/share/perl/5.10.1/Forks/Super/Job/Ipc.pm line 3115
Forks::Super::Job::Ipc::deinit_child() called
at /usr/local/share/perl/5.10.1/Forks/Super/Job.pm line 1857