diff options
Diffstat (limited to 'scripts/find-runtime-roots.pl.in')
-rwxr-xr-x | scripts/find-runtime-roots.pl.in | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/scripts/find-runtime-roots.pl.in b/scripts/find-runtime-roots.pl.in new file mode 100755 index 000000000000..e1a2dde556b6 --- /dev/null +++ b/scripts/find-runtime-roots.pl.in @@ -0,0 +1,79 @@ +#! @perl@ -w @perlFlags@ + +use strict; +use Nix::Utils; +use Nix::Config; + + +sub readProc { + return unless -d "/proc"; + + opendir DIR, "/proc" or return; + + foreach my $name (readdir DIR) { + next unless $name =~ /^\d+$/; + + my $process = "/proc/$name"; + + #print STDERR "=== $process\n"; + + my $target; + print "$target\n" if $target = readlink "$process/exe"; + print "$target\n" if $target = readlink "$process/cwd"; + + if (opendir FDS, "$process/fd") { + foreach my $name (readdir FDS) { + $target = readlink "$process/fd/$name"; + print "$target\n" if $target && substr($target, 0, 1) eq "/"; + } + closedir FDS; + } + + if (open MAP, "<$process/maps") { + while (<MAP>) { + next unless /^ \s* \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ (\/\S+) \s* $/x; + print "$1\n"; + } + close MAP; + } + + # Get all store paths that appear in the environment of this process. + eval { + my $env = Nix::Utils::readFile "$process/environ"; + my @matches = $env =~ /\Q$Nix::Config::storeDir\E\/[0-9a-z]+[0-9a-zA-Z\+\-\._\?=]*/g; + print "$_\n" foreach @matches; + } + } + + closedir DIR; +} + + +sub lsof { + return unless open LSOF, "lsof -n -w -F n 2> /dev/null |"; + + while (<LSOF>) { + next unless /^n (\/ .*)$/x; + print $1, "\n"; + } + + close LSOF; +} + + +readProc; +lsof; + + +sub printFile { + my ($fn) = @_; + if (-e $fn) { + print Nix::Utils::readFile($fn), "\n"; + } +} + + +# This is rather NixOS-specific, so it probably shouldn't be here. +printFile "/proc/sys/kernel/modprobe"; +printFile "/proc/sys/kernel/fbsplash"; +printFile "/proc/sys/kernel/poweroff_cmd"; |