Dưới đây là mã của tôi, với xử lý lỗi và các công cụ khác lấy ra cho rõ ràng:Trong perl, giết chết trẻ em và con của nó khi con được tạo bằng mở
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);
}
}
}
Việc tung ra phụ thực hiện một kịch bản shell mà lần lượt ra mắt khác quy trình, như vậy:
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 $!;
}
}
Phụ giám sát cơ bản chỉ chờ một khoảng thời gian nhất định và sau đó tìm cách giết tập lệnh trình bao.
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;
}
}
Điều này giết chết tập lệnh, tuy nhiên, nó không giết bất kỳ quy trình phụ nào của nó. Làm thế nào để khắc phục?
Tôi không có một câu trả lời cho câu hỏi chính của bạn, nhưng tôi khuyên bạn nên làm 'REAPER' một phụ vô danh, ví dụ 'my $ reaper = sub {...}; $ SIG {CHLD} = $ reaper; 'Đặt một phụ được đặt tên bên trong một phụ khác không ẩn nó khỏi các phạm vi khác. Tất cả các tên miền được đặt tên là biểu tượng gói trong Perl – friedo
http://www.speculation.org/garrick/kill-9.html –
điểm tốt, cảm ơn bạn đã chỉ ra rằng – richard