目录html
在过年后,部分运营人员反应说运营后台上传不了图片,而后查看日志,发现报错内容是/tmp/tomcat* 目录不存在
。git
环境:github
Centos7.6(aliyun)redis
/tmp/tomcat*
?/tmp/tomcat*
目录为何不存在?/tmp/tomcat*
?默认状况下,spring boot 的内置 Tomcat ,会在/tmp
建立两个目录 /tmp/tomcat*
,这个目录用于存储编译的JSP 和 上传的文件。spring
/tmp/tomcat*
目录为何不存在?不存在是由于被Linux 的机制进行清除了。shell
这个机制是什么原理:
首先咱们得从服务 systemd-tmpfiles-clean
提及。tomcat
[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点执行了一次,咱们继续看看这个服务对应的执行命令是什么?springboot
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
app
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
。ide
那么上面这个命令具体又执行了什么? 咱们在 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.
从上面这个描述我获得了两个信息:
固然咱们在 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天没有发生变化,也就会被删除。
/tmp
下建立目录配置参数 :server.tomcat.basedir
在/usr/lib/tmpfiles.d/tmp.conf
下面增长一个 x /tmp/tomcat*
官方相关的 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