ulimitが効かない不安を無くす設定


limits.conf に書いても ulimit に効いていない、というのはよくある話です。

ulimit が少なくて困ったことはあっても、多くし過ぎて困ったことはほとんどないでしょうから、ドーンと全条件下でulimit設定を効かせる方法を紹介します。



まだ知らない特殊な条件下があるかもしれませんし、もっとスマートな方法があるかもしれないので、参考までに・・・


ulimitが効かない問題

だいたいこんな内容だと思います。

  • SSHログインだと効かない
  • su すると効かない
  • OS起動時に自動起動したデーモンに効かない

  • 普通はデーモンに効けばよいので、本当に困ったら起動スクリプトに直接書いたりしますが、方法としてはイマイチなのでちょっと工夫をします。

    その前に・・・

    PAMについて

    PAMというユーザー認証システムについてはググっていただくとして、よく出てくる /etc/security/limits.conf という設定ファイルは、PAMを通る条件下でしか有効になりません。

    ではPAMを通るとはどういうことかというと、/etc/pam.d/ のファイルを見るとなんとなくわかります。システムごとに認証の設定がされています。

    そして、設定によって

    と書かれていたり、コメントアウトされてたりします。この設定が有効になっていれば limits.conf が適用されますし、無効ならば適用されません。

    つまり、PAMを使うシステムかつ pam_limits.so が有効である場合にのみ limits.conf が適用されることになります。

    limits.conf

    ユーザ名に * を使うと怪しいのでちゃんと書いたほうがよさげです。

    /etc/security/limits.conf

    /etc/security/limits.d/

    最近だと、/etc/security/limits.d/*.conf が有効だったりします。
    Hadoopパッケージは密かにここに入れてきてます。
    limits.conf にも書いてある場合は、limits.d 配下の方が優先のようです。

    SSHログイン時に効かせる

    SSHは通常、/etc/pam.d/sshd の設定なので、有効にすればログイン時に limits.conf が適用されます。

    しかし、SSHログインは普通は一般ユーザで行い、デーモンの起動はそこから su – なり sudo なりで行うので、実はあまり重要ではなかったりします。

    色々な時に効かせる

    さらに suがー sudoがー コンソールのloginはー とめんどくさくなったら、Debianの場合 /etc/pam.d/common-sessionsession required pam_limits.so を書けば有効になります。

    CentOS5だと common-session は有効な設定ファイルじゃないようで、でも runuser に書かれているからか su – しても効いてくれます。(真実は知らない)

    CentOS5 の pamバージョンが 0.99、Debian Squeezeが 1.1.1 となっているので、結構変わっているのでしょうか・・・が、あえて気にせず進みます。

    OS起動時のデーモンに効かせる

    これがやっかいで、PAMを通りません。起動スクリプトに書く以外になんかないかなーと調べてみてボツ案から。

    functions

    Debianの /lib/lsb/init-functions CentOSの /etc/init.d/functions
    の最後にulimitを直書きする手段。
    起動スクリプトの中で読み込まれてたりするのですが、読んでいないモノもあるし、あまり編集したくないファイルなのでボツ。とはいえ、手動再起動とかで限定的に役立つかもしれないので覚えておく。

    initscript

    man initscript で出てきますが、OS起動時のみ使われる設定で、DebianでもCentOSでも有効です。

    /etc/initscript

    こう書いて再起動するだけです。
    実行権限とか1行目に #!/bin/sh とかも不要です。

    プロセスの確認

    起動スクリプト内でrootのulimitが変わったとはいえ、別ユーザで動くデーモンプロセスまでちゃんと変わったかは疑うべきです。これはプロセス番号から簡単に調べられます。


    まとめ

    デーモンを手動で起動した場合と、OS起動時の自動起動の2パターンにおいて、ちゃんとプロセスまでulimitが効いてるかを確認して、できていなければ /etc/pam.d//etc/initscript で解決しましょう!

    というお話でした。
    多分まだなんか罠があるだろーなと思いつつ、おしまい。

    ulimitが効かない不安を無くす設定 への1件のコメント

    1. Allison Barnes より:

      Roxy really was fantastic. Everything was great and I would gladly recommend
      her and any of the staff I met without hesitation. The hair cut was great, and the
      service was even better.

      Most importantly, Roxy made me finally look beautiful.

      All of my hair dreams have finally come true. https://forextime.com

    Allison Barnes にコメントする コメントをキャンセル

    メールアドレスが公開されることはありません。

    次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt=""> <pre class="" title="" data-url=""> <span class="" title="" data-url="">