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() を使用して同じことを自分で行うこともできます プロセスにアタッチしたり、呼び出しをメモリに挿入したりしますが、これを正しく行うのは非常に複雑であり、お勧めできません。
適切な特権があれば、これを行う他の方法として、カーネル メモリを調べたり、カーネル モジュールをロードしたり、カーネルを変更したりする必要がありますが、これらは問題外だと思います。