Tomcat を停止しようとしたら停止しない*1ので、catalina.out を見てみると、
- /usr/local/tomcat/logs/catalina.out
2010/02/24 10:11:25 org.apache.catalina.core.StandardService stop 情報: サービス Catalina を停止します 2010/02/24 10:11:25 org.apache.catalina.session.StandardManager doUnload 致命的: 持続されたセッションの保存中のIOExceptionです: java.io.FileNotFoundException: /usr/local/apache-tomcat-6.0.24/work/Catalina/localhost/_/SESSIONS.ser (Permission denied) java.io.FileNotFoundException: /usr/local/apache-tomcat-6.0.24/work/Catalina/localhost/_/SESSIONS.ser (Permission denied) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:179) at java.io.FileOutputStream.<init>(FileOutputStream.java:70) at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:489) at org.apache.catalina.session.StandardManager.unload(StandardManager.java:463) at org.apache.catalina.session.StandardManager.stop(StandardManager.java:667) at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4611) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:924) at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1319) at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1290) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:323) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1086) at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1098) at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:448) at org.apache.catalina.core.StandardService.stop(StandardService.java:584) at org.apache.catalina.core.StandardServer.stop(StandardServer.java:744) at org.apache.catalina.startup.Catalina.stop(Catalina.java:643) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.stop(Bootstrap.java:301) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.commons.daemon.support.DaemonLoader.stop(DaemonLoader.java:200)
なんかパーミッションがないって怒られてる。
所有者が tomcat ユーザ以外のディレクトリ・ファイルがないか調べてみると、
# find /usr/local/tomcat/ -ls|perl -lane 'print "$F[4] $F[5]"'|sort -u
root root
tomcat tomcat
root になってるのがあるので、どのファイルか調べてみる。
# find /usr/local/tomcat/ -ls|perl -lane '$F[4] ne q/tomcat/ and print' 6521459 8 -rw------- 1 root root 81 1月 29 18:18 /usr/local/tomcat/work/Catalina/localhost/examples/SESSIONS.ser 6521454 8 -rw------- 1 root root 81 1月 29 18:18 /usr/local/tomcat/work/Catalina/localhost/_/SESSIONS.ser 6521458 8 -rw------- 1 root root 81 1月 29 18:18 /usr/local/tomcat/work/Catalina/localhost/docs/SESSIONS.ser
これらのファイルの所有者を tomcat:tomcat に変更して、
# find /usr/local/tomcat/ -ls|perl -lane '$F[4] ne q/tomcat/ and print $F[10]'|xargs -n1 chown tomcat:tomcat
変更されたことを確認する。
# find /usr/local/tomcat/ -ls|perl -lane 'print "$F[4] $F[5]"'|sort -u
tomcat tomcat
念のため、tomcat を再起動し、root権限のファイルが作成されないことを確認する。
# /etc/init.d/tomcat stop # /etc/init.d/tomcat start # find /usr/local/tomcat/ -ls|perl -lane 'print "$F[4] $F[5]"'|sort -u tomcat tomcat
おk!
ところで、SESSIONS.ser ってなんだ?
Absolute or relative (to the work directory for this Context) pathname of the file in which session state will be preserved across application restarts, if possible. The default is "SESSIONS.ser". See Restart Persistence for more information. Restart persistence may be disabled by setting this attribute to an empty string.
Apache Tomcat Configuration Reference - The Manager Component
*1:ps で確認するとプロセスが残っている