uid xxxxに対して開いているファイル数の制限rlimit 1024に達したました
This document (3302273) is provided subject to the disclaimer at the end of this document.
環境
Novell SUSE Linux Enterprise Server 9
Novell SUSE Linux Enterprise Server 9 Service Pack 3
問題の状況
現象:
「/var/log/messages」に警告「uid xxxxに対して開いているファイル数の制限rlimit 1024に達しました」が表示されます。
コマンド「ulimit -n」を使用してシェルにuid xxxxのユーザとしてログインすると、開いているファイルの制限値には1024より大きい値が表示されます。
「/etc/security/limits.conf」ファイルは正常に変更されており、「soft nofile」と「hard nofile」の制限はuid xxxのユーザに対して1024よりも大きな値に増加されています。
「/etc/pam.d/」配下の該当するPAM関連のファイルが正常に変更されており、「session required pam_limits.so」の行が追加されています。
変更:
これまで手動で実行していたタスクが、uid xxxxのユーザから、cronデーモンによる自動実行にスケジュールされました。
同じ操作をuid xxxxのユーザとしてシェルにログインして実行した場合、すべて正常に機能し、「/var/log /messages」にエラーは記録されません。
Novell SUSE Linux Enterprise Server 9では、cronデーモンはPAMを認識しません。
解決策
Novell SUSE Linux Enterprise Server 9では、cronデーモンはPAMを認識しませんが、「/etc/pam.d/」配下のどのファイルを変更してもcronデーモンの動作は変更されず、「/etc/security/limits.conf」で指定された制限が使用されません。
その代わり、cronデーモンはデフォルトの環境としてシェル「/bin/sh」を使用し、ここからデフォルトの制限値を取得します。
この問題に対処し、cronがスケジュールされたタスクの制限を増加する方法はいくつかありますが、ここでは2つのソリューションを示します。
1) ファイル「/etc/init.d/cron」に行「ulimit -n 65536」(括弧は除く)を追加して変更します。
行を挿入する場所は、次のようにcronスクリプト自身の「start)」というラベルのセクションが適しています。
[...]
case "$1" in
start)
ulimit -n 65536
for al_de in {allow,deny}{,.rpmsave,.rpmorig} ; do
if [ -f /var/spool/cron/$al_de ] ; then
allow_deny_move_info
break
fi
done
echo -n "Starting CRON daemon"
## Start daemon with startproc(8). If this fails
## the echo return value is set appropriate.
# NOTE: startproc return 0, even if service is
# already running to match LSB spec.
startproc $CRON_BIN
# Remember status and be verbose
rc_status -v
;;
[...]
これによって、開くファイルのソフトおよびハード制限値が65536まで増加し、cronが実行するすべてのタスクについて有効になります。この変更を反映するには、サーバを再起動する必要があります。
2) 「/etc/initscript」ファイルを使用します。
initscriptのマニュアルページ(man initscript)に記述してあるように、ファイル「/etc/initscript」を作成して、各プロセスに対してulimitおよびumaskのデフォルト値などの設定に使用できます。次のinitscriptでは、開いているファイルのハード制限を各プロセスについて65536に増加します。
# Increase the hard file descriptor limit for all processes
# to 65536. The soft limit is still 1024, but any unprivileged
# process can increase it's soft limit up to the hard limit
# with "ulimit -Sn xxx" (needs a 2.2.13 or later Linux kernel).
ulimit -Hn 65536
# Execute the program.
eval exec "$4"
この方法では、開くファイルのハード制限はシステム内のすべてのプロセスに対して増加しますが、ソフト制限はデフォルト値の1024のままであることに注意してください。
マニュアルページのNOTESセクションをよくお読みください。
このスクリプトは、デーモンなどのスタートアップスクリプト用ではありません。rc.localスタイルのスクリプトとは
関係ありません。単に/etc/inittabから実行されるもののハンドラです。このスクリプトを実行するとシステムが起動(再起動)できなくなります。
説明した対応策は両方とも実験環境と運用環境でテストされ、cronでスケジュールされたタスクで開くファイルのデフォルト値が1024を正常に超えました。ただし、最初の対応策は、cronを実行するタスクのみについて制限を増加し、2番目の方法のようにすべてのプロセスについて増加しないため、影響度と危険度が低くなります。
追加情報
Novell SUSE Linux Enterprise Server 10では、cronデーモンはPAMを認識するようになり、「/etc/pam.d/crond」がcronデーモン自身のPAM構成ファイルです。行「session required pam_limits.so」を「/etc/pam.d/crond」に追加すると、cronデーモンがデフォルトエントリ(*)について「/etc/security/limits.conf」で指定された制限を使用するようになります。
Disclaimer
この情報は、米国Novell, Inc.およびノベル株式会社の内外から発生したものです。本文書の内容または本文書を使用した結果について、いかなる保証、表明または約束も行っていません。また、本文書の商品性、および特定目的への適合性について、いかなる黙示の保証も否認し、排除します。
本文書に記載されている会社名、製品名はそれぞれ各社の商品、商標または登録商標です。
- ドキュメントID: 3302273
- 作成年月日: 21-AUG-2007
- 修正年月日: 03-MAR-2009
- ドキュメントリビジョン:
- 分類:
- 対象NOVELL製品およびバージョン: SUSE Linux Enterprise Server
- カテゴリ: