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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jetty部署中tmpdir导致服务不可用问题相关的知识,希望对你有一定的参考价值。

1、问题

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

2、分析

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

备注:

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的文件实例被设置和检索。

3、解决方案

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

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

方案三:
排除相关的jetty的缓存文件,如:
echo >> /usr/lib/tmpfiles.d/tmp.conf <<EOF
X /tmp/jetty-*
EOF

Jetty热部署问题

1、问题

由于上传文件到webapps目录下,触发服务的热部署,自动重启服务。

2、解决

vi etc/jetty-deploy.xml
<Set name="scanInterval"><Property name="jetty.deploy.scanInterval" default="0"/></Set>
备注:将default值修改为1


以上是关于Jetty部署中tmpdir导致服务不可用问题的主要内容,如果未能解决你的问题,请参考以下文章

用InteliJ IDEA时,服务器tomcat或Jetty之前部署的项目怎么去掉,现在每次启动都要加载挺多,有朋友知道吗~

Qt windeployqt 导致部署不可用

Jetty热部署问题

Jetty热部署问题

在 jetty 中部署 webapps 和 websockets

jetty;tomcat;热部署