IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Jetty部署中tmpdir导致服务不可用的问题

    longhao (longtask@gmail.com)发表于 2012-01-11 00:16:25
    love 0

         问题现象

    Java进程存在,Servlet服务存在,cpu使用率低,未发现死锁。重启服务器,问题得到解决。

         问题分析

        根据tomcat的解压部署方式,发现jetty中设置为:-Djava.io.tmpdir=/tmp , 根据返回的错误搜索/tmp jetty,发现linux存在watchdong自动清理tmp目录。

    [root@updata jetty]# cat /etc/cron.daily/tmpwatch

    #! /bin/sh

    flags=-umc

    /usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \

            -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \

            -X '/tmp/hsperfdata_*' 10d /tmp

    /usr/sbin/tmpwatch "$flags" 30d /var/tmp

    for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do

        if [ -d "$d" ]; then

            /usr/sbin/tmpwatch "$flags" -f 30d "$d"

        fi

    done

    系统默认每10天清理一次/tmp目录。

    Spring会在系统启动加载类到内存中,但是不会加载servlet的相关内容。查看jetty的文档,Temporary Directories 有如下说明:

    【本段文字为翻译】Jetty 本身没有临时目录,每个应用在war解压的时候指定temp目录,JSPs在运行是编译。

    确定一个应用临时目录的算法如下:

    1:尝试使用这个应用明确指定的目录:

    • 如果 webapp.getTempDirectory() 设置了,则使用它,在JVM运行时不要删除这个目录。
    • 如果web应用的javax.servlet.context.tempdir这个上下文属性设置,这个目录存在,并且可写。则使用它,在JVM运行时不要删除它。

    2:基于全局设置创建一个目录。这个目录中在war解压后产生的目录是这样的: "Jetty_"host""port""context""+virtualhost

    • 如果 $(jetty.home)/work 存在,不要在JVM运行的时候删除,不能在文件夹存在的时候删除里面的内容
    • 如果WEB-INF/work存在,不能在jvm运行的时候删除,不能删除文件夹中的内容。
    • 或者是创建目录 $(java.io.tmpdir) ,在JVM退出的时候删除这个目录,如果该目录存在,删除该目录的内容。

    一个重要的提示:webapp的临时目录只能在它停止的时候删除里面的内容。

    一旦临时目录被分配,它将作为一个web应用的javax.servlet.context.tempdir的文件实例被设置和检索。

     

         解决问题的方法:

    方法1:在jetty.home目录下面创建一个可写的文件夹work,去掉davinci.sh中的-Djava.io.tmpdir=/tmp 设置。

    方法2:修改davinci.sh中的-Djava.io.tmpdir=/tmp为-Djava.io.tmpdir=指定的目录 ,然后在davinci.sh的stop函数中设置删除该目录中的内容。重要提示:每个应用设置的目录不能相同



沪ICP备19023445号-2号
友情链接