summaryrefslogtreecommitdiffstats
path: root/perl-install
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install')
-rw-r--r--perl-install/pkgs.pm28
1 files changed, 28 insertions, 0 deletions
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 (<F>) {
+ /^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);
}