From 5b7c8e3c88d8a924517263724f8680ba925f369a Mon Sep 17 00:00:00 2001 From: Francois Pons Date: Wed, 7 Mar 2001 13:55:56 +0000 Subject: added support for killing all child process of a transaction, necessary to be able to umount cdrom and eject it correctly. --- perl-install/pkgs.pm | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'perl-install/pkgs.pm') diff --git a/perl-install/pkgs.pm b/perl-install/pkgs.pm index 6545ce9ee..a3b070419 100644 --- a/perl-install/pkgs.pm +++ b/perl-install/pkgs.pm @@ -1289,6 +1289,34 @@ sub install($$$;$$) { log::l("rpm database closed"); close OUTPUT; + + #- now search for child process which may be locking the cdrom, making it unable to be ejected. + my (@killpid, %tree, $pid); + local (*DIR, *F, $_); + opendir DIR, "/proc"; + while ($pid = readdir DIR) { + $pid =~ /^\d+$/ or next; + open F, "/proc/$pid/status"; + while () { + /^Pid:\s+(\d+)/ and $pid == $1 || die "incorrect pid reported for $pid (found $1)"; + if (/^PPid:\s+(\d+)/) { + $tree{$pid} and die "PPID already found for $pid, previously $tree{$pid}, now $1"; + $tree{$pid} = $1; + } + } + close F; + } + closedir DIR; + foreach (keys %tree) { + $pid = $_; while ($pid = $tree{$pid}) { $pid == $$ and push @killpid, $_ } + } + if (@killpid) { + log::l("killing process ". join(", ", @killpid)); + kill 15, @killpid; + sleep 2; + kill 9, @killpid; + } + c::_exit(0); } -- cgit v1.2.1