dwww Home | Show directory contents | Find package

#!/usr/bin/perl
# sort_res.perl5 - Script to group & sort lsof output by resource
#
# Copyright (c) 2004, 2005 - Fabian Frederick <fabian.frederick@gmx.fr>
#
# This program/include file is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program/include file is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (in the main directory of the Linux-NTFS
# distribution in the file COPYING); if not, write to the Free Software
# Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Note : 
#       -This script uses lsof released by Victor A. Abell
#       -lsof path recovery comes from standard perl scripts in there.
#
# Usage :
#       perl sort_res.perl5 -> display used resources + size
#       or perl sort_res.perl5 <program name>
#
# 12/2005 (FabF) 
#       -size reset in loop (script was broken in 4.76)
#       -isexec looking in .. (like other scripts)
#       -display for one or all processes
#       -removing unuseful line number arg.
#       -display global size

my @args = @_;

# Set path to lsof.
if (($LSOF = &isexec("../lsof")) eq "") {    # Some distros use lsof
                                                    # out of $PATH
    if (($LSOF = &isexec("lsof")) eq "") {          # Then try . and $PATH
        if (($LSOF = &isexec("../lsof")) eq "") {    # Then try ..
            print "can't execute $LSOF\n"; exit 1
        }
    }
}

if ($ARGV[0] ne ""){
    $cmd="$LSOF -nPl -Fcns -c".$ARGV[0]."|";
}else{
    $cmd="$LSOF -nPl -Fcns|";   
}

#Parse lsof output to gather command, resource name, pid and size
#Some extradata stand to keep script genericity 
$i=0;
if (open(FILE, $cmd)){
    while (defined ($line=<FILE>)){
        $cline=$line;
        $cline =~ s"^(.)"";
        $cline =~ s/^\s+|\s+$//g;
        if($line=~m/^p/){
            $pid=$cline;
        }else{
            if($line=~/^s/){
                $size = $cline;
            }else{
                if($line=~/^c/){
                    $command = $cline;
                }else{
                    if($line=~/^n/){
                        $name = $cline;
                        $data{$i} = { command => $command, name => $name,
                                      pid => $pid , size => $size};
                        $size=0;
                        $i = $i+1;
                    }
                }
            }
        }
    }
}

#Resource name sorting
sub byresname { $data{$a}{name} cmp $data{$b}{name}}
@ks=sort byresname (keys %data);

#Resource grouping
$i=0;
$cname="a";
foreach $k (@ks){
    if ($data{$k}{name} ne $cname){
        $dgroup{$i} = { name => $data{$k}{name}, size => $data{$k}{size}};
        $cname = $data{$k}{name};
        $i++;
    }   
}

#Size sort on resource hash
sub bysize { $dgroup{$a}{size} <=> $dgroup{$b}{size} }
@ks=sort bysize (keys %dgroup);
$gsize=0;
printf("  -- KB --  -- Resource --\n", );
foreach $k (@ks){
        printf("%10d  %s\n", $dgroup{$k}{size}/1024, $dgroup{$k}{name});
        $gsize+=$dgroup{$k}{size};
}

printf("Total KB : %10d\n", $gsize/1024);
## isexec($path) -- is $path executable
#
# $path   = absolute or relative path to file to test for executabiity.
#           Paths that begin with neither '/' nor '.' that arent't found as
#           simple references are also tested with the path prefixes of the
#           PATH environment variable.  

sub
isexec {
    my ($path) = @_;
    my ($i, @P, $PATH);

    $path =~ s/^\s+|\s+$//g;
    if ($path eq "") { return(""); }
    if (($path =~ m#^[\/\.]#)) {
        if (-x $path) { return($path); }
        return("");
    }
    $PATH = $ENV{PATH};
    @P = split(":", $PATH);
    for ($i = 0; $i <= $#P; $i++) {
        if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
    }
    return("");
}

Generated by dwww version 1.14 on Tue Aug 26 14:36:16 CEST 2025.