2010年07月06日

Too many open filesで死んだプロセスを自動回復。

運用しているメールサーバー(james)がたま〜にダウンする。

エラーの内容は以下。

Exception caught while storing Message Container: java.lang.RuntimeException: Exception c
aught while storing a stream : java.io.FileNotFoundException: /usr/local/james/apps/james/var/mail/outgoing/4D61696C313237383338303733353739362D353235392D746F
2D646F636F6D6F2E6E652E6A70.Repository.FileStreamStore (Too many open files)

ulimit -a で確認したところ以下の内容だった。

core file size     (blocks, -c) 0
data seg size      (kbytes, -d) unlimited
scheduling priority       (-e) 0
file size        (blocks, -f) unlimited
pending signals         (-i) 73728
max locked memory    (kbytes, -l) 32
max memory size     (kbytes, -m) unlimited
open files           (-n) 1024
pipe size      (512 bytes, -p) 8
POSIX message queues   (bytes, -q) 819200
real-time priority       (-r) 0
stack size       (kbytes, -s) 10240
cpu time        (seconds, -t) unlimited
max user processes       (-u) 73728
virtual memory     (kbytes, -v) unlimited
file locks           (-x) unlimited

open filesが1024は少ないな。

/etc/security/limits.confで調整するのもいいが、PAM認証を介さないようなdaemon系プログラムの制限には/etc/security/limits.confは使えないということもあるらしいし、root権限あるので簡単にulimit -n65536で対応することにした。

再度確認すると、
open files           (-n) 65536

になっていた。これで様子を見てみよう。

でも、上記の対応もあまり自信がないので、プロセス監視して死んでたら起動してくれるシェルも作った。

#!/usr/bin/sh

isAlive=`ps -ef | grep "james" | grep -v grep | wc -l`
if [ $isAlive = 1 ]; then
 echo "プロセスは生きています"
else
 echo "プロセスは死んでいます"
 /etc/init.d/james stat
fi


このシェルをCronにでも登録して適当な間隔で動かすとするか。
posted by hana at 13:20| Comment(0) | TrackBack(0) | Linux関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。