web-dev-qa-db-ja.com

ulimitの使用状況を確認する方法

特定のユーザーのulimitの使用状況を確認する方法はありますか?起動時に単一のプロセスまたは実行時に単一のシェルのulimitを変更できることはわかっていますが、ユーザーが制限に達したかどうかを「監視」できるようにしたいと考えています。現在の使用率をstatsdに報告するbashスクリプトを書くことを計画しています。具体的には、以下を追跡します。

  1. ファイルを開く(ulimit -n
  2. 最大ユーザープロセス(ulimit -u
  3. 保留中のシグナル(ulimit -i

私が欲しいのは使用率(0-100)です。

34
hazmat

多分これは最初の質問に役立ちます:

特定のユーザーのプロセスID(PID)がわかっている場合は、次のコマンドを使用して各プロセスの制限を取得できます。

cat /proc/<PID>/limits

次のコマンドを使用して、各PIDの開いているファイルの数を取得できます。

ls -1 /proc/<PID>/fd | wc -l

次に、Max open filesの値を2番目のコマンドからのオープンファイル記述子の数と比較して、割合を取得します。

25
m13r

いくつかの不便な方法と標準ツールによって、現在のユーザーの開いているファイル、プロシージャ、および保留中のシグナルの割合を出力します。

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

私のシステムでの出力:

59%
9%
0%

これらの数値が適切であると仮定すると、この答えが示すのは、シェルで実行できるということですが、はるかに優れたシェルメソッドがない限り、そうすべきではないでしょう。むしろ、このQはgccまたはpythonetc。を使用する方が適切です。

10
agc