Můžete zkusit napsat skript, který pravidelně volá lsof -p {PID}
na daném pid.
k zobrazení 20 nejlepších popisovačů souborů pomocí procesů:
for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20
výstup je ve formátu souboru handle count, pid, cmndline for process
příklad výstupu
701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle
Počítejte položky v /proc/<pid>/fd/
. Tvrdé a měkké limity procesu lze nalézt v /proc/<pid>/limits
.
Jediná rozhraní poskytovaná jádrem Linuxu pro získání limitů zdrojů jsou getrlimit()
a /proc/
pid /limits
. getrlimit()
může získat pouze limity prostředků volajícího procesu. /proc/
pid /limits
umožňuje získat limity zdrojů libovolného procesu se stejným uživatelským jménem a je k dispozici na RHEL 5.2, RHEL 4.7, Ubuntu 9.04 a jakékoli distribuci s jádrem 2.6.24 nebo novějším.
Pokud potřebujete podporovat starší linuxové systémy, budete muset přimět samotný proces, aby volal getrlimit()
. Samozřejmě nejjednodušší způsob, jak toho dosáhnout, je upravit program nebo knihovnu, kterou používá. Pokud program spouštíte, můžete použít LD_PRELOAD
k načtení vlastního kódu do programu. Pokud nic z toho není možné, můžete se připojit k procesu pomocí gdb a nechat jej provést volání v rámci procesu. Můžete také udělat totéž sami pomocí ptrace()
pro připojení k procesu, vložení hovoru do jeho paměti atd., nicméně to je velmi komplikované a nedoporučuje se to.
S příslušnými oprávněními by další způsoby, jak toho dosáhnout, zahrnovaly prohlížení paměti jádra, načtení modulu jádra nebo jinou úpravu jádra, ale předpokládám, že to nepřichází v úvahu.