lsof -p {PID}
を定期的に呼び出すスクリプトを作成してみてください。 指定された pid で。
プロセスを使用した上位 20 個のファイル ハンドルを表示するには:
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
出力はファイル ハンドル カウント、pid、プロセスのコマンドラインの形式です
出力例
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
/proc/<pid>/fd/
のエントリを数えます .プロセスに適用されるハード制限とソフト制限は、/proc/<pid>/limits
にあります。 .
リソース制限を取得するために Linux カーネルが提供する唯一のインターフェースは getrlimit()
です と /proc/
pid /limits
. getrlimit()
呼び出しプロセスのリソース制限のみを取得できます。 /proc/
pid /limits
同じユーザー ID を持つプロセスのリソース制限を取得でき、RHEL 5.2、RHEL 4.7、Ubuntu 9.04、および 2.6.24 以降のカーネルを使用するディストリビューションで利用できます。
古い Linux システムをサポートする必要がある場合は、プロセス自体で getrlimit()
を呼び出す必要があります。 .もちろん、これを行う最も簡単な方法は、プログラムまたはそれが使用するライブラリを変更することです。プログラムを実行している場合は、 LD_PRELOAD
を使用できます 独自のコードをプログラムにロードします。これらのいずれも可能でない場合は、gdb を使用してプロセスにアタッチし、プロセス内で呼び出しを実行させることができます。 ptrace()
を使用して同じことを自分で行うこともできます プロセスにアタッチしたり、呼び出しをメモリに挿入したりしますが、これを正しく行うのは非常に複雑であり、お勧めできません。
適切な特権があれば、これを行う他の方法として、カーネル メモリを調べたり、カーネル モジュールをロードしたり、カーネルを変更したりする必要がありますが、これらは問題外だと思います。