Speicherbelegung eines einzelnen Benutzer aufsummieren

FreeBSD, Gentoo, openSUSE, CentOS, Ubuntu, Debian
mem
Posts: 45
Joined: 2003-12-22 11:09

Speicherbelegung eines einzelnen Benutzer aufsummieren

Post by mem » 2005-01-07 14:20

Moin.

Gibt es eigentlich einen einfachen Weg, den total belegten Speicher eines Benutzers anzuzeigen?

Die RSS in ps oder die SIZE von lsof muss man sonst immer manuell zusammenaddieren. Gerade wegen den Angaben in limits.conf muesste es doch einen Weg geben, den insgesamt belegten Speicher eines Users anzuzeigen. Vielleicht wusste ich sogar mal wie das ging.

Danke.
Gruss, Jan.

dodolin
RSAC
Posts: 4009
Joined: 2003-01-21 01:59
Location: Sinsheim/Karlsruhe

Re: Speicherbelegung eines einzelnen Benutzer aufsummieren

Post by dodolin » 2005-01-07 19:38

Wenn dir ein paar Zeilen selbstgeschriebenes Perl nicht zu viel sind, würde ich dir raten, mal einen Blick auf das Modul Proc::ProcessTable zu werfen.

http://www.thomas-fahle.de/pub/perl/UNI ... Table.html
http://www.linux-magazin.de/Artikel/aus ... /proc.html

mem
Posts: 45
Joined: 2003-12-22 11:09

Re: Speicherbelegung eines einzelnen Benutzer aufsummieren

Post by mem » 2005-01-07 21:12

Hey dodolin,

vielen herzlichen Dank fuer den Tipp!
Falls irgendwann jemand vor einem aehnlichen Problem steht, hier das Resultat:

Aufrufen via ./script.pl [uid|username...]

Code: Select all

#!/usr/bin/perl

use Proc::ProcessTable;
$tab = new Proc::ProcessTable;

foreach (@ARGV)
{
        $user = $_;
        $mem = 0;
        $memsize = 0;
        $liste = '';

        if($user ne $user + 0)
        {
                $username = $user;
                $userid = getpwnam($user);
        } else {
                $username = getpwuid($user);
                $userid = $user;
        }

        foreach $proc ( @{$tab->table} )
        {
                if($proc->uid eq $userid)
                {
                        $mem += $proc->rss;
                        $memsize += $proc->size;
                        $liste .= sprintf("%6d %10d %sn",
                                        $proc->pid, $proc->rss,
                                        $proc->cmndline || $proc->fname);
                }
        }

        printf("n%s: %5d MB (%d MB)n   PID       SIZE CMDn%s", 
                $username, $mem/1024/1024, 
                $memsize/1024/1024, $liste);
        print "------------------------------------------------------n";
}