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


29

特定のユーザーのulimitsの使用を確認する方法はありますか?起動時に単一のプロセスまたは実行時に単一のシェルのulimitを変更できることは知っていますが、ユーザーが制限にどれだけ近づいているかを「監視」できるようにしたいと思います。bash現在の使用率をstatsdに報告するスクリプトを作成する予定です。具体的には、追跡したい:

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

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


カーネルでプロセスアカウンティングを有効にしている場合、ユーザーに関する詳細な使用統計を収集できます。
ケーシー

プロセスアカウンティングを有効にする方法
-hazmat

そして、これはどのくらいのオーバーヘッドを追加しますか?
-hazmat

回答:


22

たぶんこれは最初の質問に役立ちます:

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

cat /proc/<PID>/limits

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

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

次に、の値をMax open files2番目のコマンドのオープンファイル記述子の数と比較して、パーセンテージを取得します。


8

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

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、またはpythonなど


-4

Ulimitsはプロセスのプロパティであり、子プロセスに継承されます。

別のプロセスの制限を取得することはできません。


2
ナンセンス。man lsofman ps、...
ジル「SO-停止されて悪」

1
UNIXがどのように機能し、lsofがその結果をどのように取得するかを理解していないようです。lsofはカーネルメモリを読み取って値を取得します。lsofで使用されるドキュメント化されたインターフェイスはないため、内部カーネルデータ構造にわずかな変更が加えられた場合でもlsofは失敗します。
気味悪い

2
lsofメンテナーにとっては頭痛の種です。しかし、エンドユーザーには関係ありません。また、この質問の文脈では正しくありませんman proc。これは、インターフェイスについて文書化されているLinuxについて具体的に尋ねているためです()。
ジル「SO-悪であるのをやめる」

この場合、予告なしに変更される可能性のあるドキュメント化されていないインターフェイスについて説明しています。
気味悪い

1
担当者が少ないというこの原因に反対票を投じることはできませんので、コメントします-1
ズン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.