1、问题

在过年后,部分运营人员反应说运营后台上传不了图片,然后查看日志,发现报错内容是/tmp/tomcat* 目录不存在

环境:

  • spring boot 1.5.15
  • Centos7.6(aliyun)

2、 问题解析

  1. 为什么需要使用这个/tmp/tomcat*?
  2. 那个 /tmp/tomcat* 目录为什么不存在?

2.1、 为什么需要使用这个/tmp/tomcat*?

默认情况下,spring boot 的内置 Tomcat ,会在/tmp创建两个目录 /tmp/tomcat*,这个目录用于存储编译的JSP 和 上传的文件。

2.2、那个 /tmp/tomcat* 目录为什么不存在?

不存在是因为被Linux 的机制进行清除了。

这个机制是什么原理:

首先我们得从服务 systemd-tmpfiles-clean 说起。

[root@djx ~]# systemctl  status  systemd-tmpfiles-clean
● systemd-tmpfiles-clean.service - Cleanup of Temporary Directories
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.service; static; vendor preset: disabled)
Active: inactive (dead) since Tue 2020-02-25 09:10:36 CST; 12h ago
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Process: 21819 ExecStart=/usr/bin/systemd-tmpfiles --clean (code=exited, status=0/SUCCESS)
Main PID: 21819 (code=exited, status=0/SUCCESS) Feb 25 09:10:36 djx systemd[1]: Starting Cleanup of Temporary Directories...
Feb 25 09:10:36 djx systemd[1]: Started Cleanup of Temporary Directories.

我们可以看到这个服务今天上午 9点执行了一次,我们继续看看这个服务对应的执行命令是什么?

cat  /usr/lib/systemd/system/systemd-tmpfiles-clean.service
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version. [Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=systemd-readahead-collect.service systemd-readahead-replay.service local-fs.target time-sync.target
Before=shutdown.target [Service]
Type=oneshot
ExecStart=/usr/bin/systemd-tmpfiles --clean
IOSchedulingClass=idle

我们先记住这个执行命令是/usr/bin/systemd-tmpfiles --clean,我们再来关心下,与这个服务相关的定时器 /usr/lib/systemd/system/systemd-tmpfiles-clean.timer

cat  /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version. [Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8) [Timer]
OnBootSec=15min
OnUnitActiveSec=1d

我们从这知道在启动后的15分钟或者距离上一次执行一天 会执行我们上面的命令/usr/bin/systemd-tmpfiles --clean

那么上面这个命令具体又执行了什么? 我们在 man systemd-tmpfiles 中找到了一些东西。

DESCRIPTION
systemd-tmpfiles creates, deletes, and cleans up volatile and temporary files and directories, based on the configuration file format and location
specified in tmpfiles.d(5). If invoked with no arguments, it applies all directives from all configuration files. If one or more filenames are passed on the command line, only
the directives in these files are applied. If only the basename of a configuration file is specified, all configuration directories as specified in
tmpfiles.d(5) are searched for a matching file.

从上面这个描述我得到了两个信息:

  1. 就是 systemd-tmpfiles 用来创建和清理临时性的目录和文件。
  2. systemd-tmpfiles 会从 tmpfiles.d 中获取配置文件。

当然我们在 man systemd-tmpfiles 中还可以了解到一些参数命令。

我们接着去看 tmpfiles.d, 我们在 man tmpfiles.d中可以看到 tmpfiles.d 的作用就是用于清理临时文件和目录的配置。 我们还可以看到它的配置存储于

/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles.d/*.conf

在这里我们还可以看到配置文件里面的相关注解。

接下来我们去上面列出的三个目录里面找找看有没有相关清理/tmp的东西。

最后在 /usr/lib/tmpfiles.d/tmp.conf 里面找到了,

cat /usr/lib/tmpfiles.d/tmp.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version. # See tmpfiles.d(5) for details # Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d # Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp

我们可以看其中的两个配置

v /tmp 1777 root root 10d  # 就是当 /tmp 目录不存在的时间进行创建(权限为777,用户和用户组为root),并清理/tmp下超过10天的文件。
x /tmp/systemd-private-%b-* # 忽略清理的目录
X /tmp/systemd-private-%b-*/tmp # 这个只忽略目录,但不忽略该目录下面的内容

意思就是 清理/tmp 目录下超过10天没有变化的文件,但不清理/tmp/systemd-private-%b-*/tmp/systemd-private-%b-*/tmp.

总结 系统会自动进行清理 /tmp 目录下10天没有变化的文件和目录

过年期间我们的 Tomcat 生成的目录如果10天没有发生变化,也就会被删除。

三、解决办法

修改 springboot 配置,不要在/tmp 下创建目录

配置参数 :server.tomcat.basedir

修改 清理 /tmp 下面的文件的机制

/usr/lib/tmpfiles.d/tmp.conf 下面增加一个 x /tmp/tomcat*

四、spring boot 官方解答

官方相关的 issue :

https://github.com/spring-projects/spring-boot/issues/9616,

在最底部我们可以

You can see the list of releases that contain the fix in the commit that closed this issue. In the 2.1.x line it was fixed in 2.1.4.

看到 2.1.4 版本已经解决了该问题。在 1系列的版本中,我们可以看到在 1.5.20 中也修复了,github对应的提交记录

参考:https://www.cnblogs.com/samtech/p/9490166.html

Spring boot内置Tomcat的临时目录被删除导致文件上传不了-问题解析的更多相关文章

  1. Spring boot 内置tomcat禁止不安全HTTP方法

    Spring boot 内置tomcat禁止不安全HTTP方法 在tomcat的web.xml中可以配置如下内容,让tomcat禁止不安全的HTTP方法 <security-constraint ...

  2. 自定义Spring Boot内置tomcat的404页面

    spring boot 的相关404页面配置都是针对项目路径下的(如果配置了 context-path) 在context-path不为空的情况下,如果访问路径不带context-path,这时候会显 ...

  3. Spring Boot内置Tomcat

    Spring Boot默认支持Tomcat/Jetty/Undertow作为底层容器.在之前实战相关的文章中,可以看到引入spring-boot-starter-web就默认使用tomcat容器,这是 ...

  4. 配置spring boot 内置tomcat的accessLog日志

    #配置内置tomcat的访问日志server.tomcat.accesslog.buffered=trueserver.tomcat.accesslog.directory=/home/hygw/lo ...

  5. SpringBoot内置Tomcat缓存文件目录被意外删除导致异常

    在项目中,一般会将文件临时保存到缓存目录 当时使用 File.createTempFile("tmp", ext, (File) request.getServletContext ...

  6. springboot-为内置tomcat设置虚拟目录

    需求 项目使用springboot开发,以jar包方式部署.项目中文件上传均保存到D判断下的upload目录下. 在浏览器中输入http://localhost:8080/upload/logo_1. ...

  7. 如何优雅的关闭基于Spring Boot 内嵌 Tomcat 的 Web 应用

    背景 最近在搞云化项目的启动脚本,觉得以往kill方式关闭服务项目太粗暴了,这种kill关闭应用的方式会让当前应用将所有处理中的请求丢弃,响应失败.这种形式的响应失败在处理重要业务逻辑中是要极力避免的 ...

  8. Spring Boot 内嵌Tomcat的端口号的修改

    操作非常的简单,不过如果从来没有操作过,也是需要查找一下资料的,所以,在此我简单的记录一下自己的操作步骤以备后用! 1:我的Eclipse版本,不同的开发工具可能有所差异,不过大同小异 2:如何进入对 ...

  9. Spring Boot内嵌Tomcat session超时问题

    最近让Spring Boot内嵌Tomcat的session超时问题给坑了一把. 在应用中需要设置session超时时间,然后就习惯的在application.properties配置文件中设置如下, ...

随机推荐

  1. 基于JS实现归并排序算法

    /*********************************************JS归并排序************************************************ ...

  2. 01Java语言基础

    [实验任务四]: 1.程序设计思想 根据RandomStr.java,随机生成6位字母,在对话框中输出,用户根据随机生成的验证码对应输入,程序根据用户输入的内容与系统随机生成的验证码字符比较,若相等, ...

  3. 团队第一次作业(By七个小矮人)

    一.团队简介 1.团队名称:七个小矮人 2.团队成员列表 201731024137 马驰(队长) 201731021227 于丁 201731024114 杨汶桐 201731024125 李朋珂 2 ...

  4. Kafka -入门学习

    kafka 1. 介绍 官网 http://kafka.apache.org/ 介绍 http://kafka.apache.org/intro 2. 快速开始 1. 安装 路径: http://ka ...

  5. Python+Flask+MysqL的web技术建站过程

    1.个人学期总结 时间过得飞快,转眼间2017年就要过去.这一年,我学习JSP和Python,哪一门都像一样新的东西,之前从来没有学习过. 这里我就用我学习过的Python和大家分享一下,我是怎么从一 ...

  6. Http请求特殊符号变空格

    Http请求特殊符号变空格 今天在调试客户端向服务器传递参数时,url中的参数值出现+,空格,/,?,%,#,&等特殊符号的时候就自动变成空格,在服务器端无法获得正确的参数值.解决方法如下: ...

  7. go--->共享内存和通信两种并发模式原理探究

    共享内存和通信两种并发模式原理探究 并发理解 人类发明计算机编程的本质目的是为了什么呢?毫无疑问是为了解决人类社会中的各种负责业务场景问题.ok,有了这个出发点,那么想象一下,比如你既可以一心一意只做 ...

  8. 痞子衡嵌入式:知名半导体MCU大厂软件开发C代码规范

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是飞思卡尔软件开发C语言编码规范. 2020鼠年春节是个漫长的假期,痞子衡在家百无聊赖,翻出了2016年10月1日(这个时间是痞子衡正式开始 ...

  9. 云原生 - Why is istio(二)

    出处:https://cizixs.com/2018/08/26/what-is-istio 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 前言 随着微服务架构的流行, ...

  10. 虚拟机 ubuntu系统忘记密码如何进入

    重启 虚拟机 按住shift键 会出现下面的界面 按住‘e’进入下面的界面往下翻 更改红框勾到的字符串为:  rw init=/bin/bash 然后按F10进行引导 然后输入 :”passwd”  ...