エラーの内容は以下。
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にでも登録して適当な間隔で動かすとするか。