這裏是我的代碼,錯誤處理和其他的東西爲清楚起見移除:在Perl中,殺害兒童和它的孩子孩子使用開放創建時
sub launch_and_monitor {
my ($script, $timeout) = @_;
sub REAPER {
while ((my $child = waitpid(-1, &WNOHANG)) > 0) {}
$SIG{CHLD} = \&REAPER;
}
$SIG{CHLD} = \&REAPER;
my $pid = fork;
if (defined $pid) {
if ($pid == 0) {
# in child
monitor($timeout);
}
else {
launch($script);
}
}
}
推出子執行shell腳本,啓動其他過程,像這樣:
sub launch($) {
my ($script) = @_;
my $pid = open(PIPE, "$script|");
# write pid to pidfile
if ($pid != 0) {
while(<PIPE>) {
# do stuff with output
}
close(PIPE) or die $!;
}
}
監視器子基本上只是等待指定的時間週期,然後嘗試殺外殼腳本。
sub monitor($) {
my ($timeout) = @_;
sleep $timeout;
# check if script is still running and if so get pid from pidfile
if (...) {
my $pid = getpid(...);
kill 9, $pid;
}
}
這會殺死腳本,但是它不會殺死它的任何子進程。怎麼修?
我沒有回答你的主要問題,但我會建議做'REAPER'匿名子,例如'我的$ reaper = sub {...}; $ SIG {CHLD} = $ reaper;'將一個名爲sub的子文件放入另一個子文件夾中並不會將其隱藏在其他作用域中。所有指定的subs都是Perl中的包號符號 – friedo 2009-11-04 18:39:39
http://www.speculation.org/garrick/kill-9.html – 2009-11-04 19:21:18
好點,謝謝指出 – richard 2009-11-04 19:36:16