ablog

不器用で落着きのない技術者のメモ

致命的: 持続されたセッションの保存中のIOExceptionです ... SESSIONS.ser (Permission denied)

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  129 18:18 /usr/local/tomcat/work/Catalina/localhost/examples/SESSIONS.ser
6521454    8 -rw-------   1 root     root           81  129 18:18 /usr/local/tomcat/work/Catalina/localhost/_/SESSIONS.ser
6521458    8 -rw-------   1 root     root           81  129 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 で確認するとプロセスが残っている