首頁>技術>

概述

分享最近應用碰到的一個奇怪bug,一開始以為是程式碼上的問題,找了一段時間發現居然是因為系統的一個自動清理規則導致,下面一起來看看吧~

一、應用報錯:
logwire.core.exceptions.GeneralUnhandledException: 服務端未處理異常...Caused by: org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception isjava.io.IOException: The temporary upload location [/tmp/tomcat.5454715517323162300.8031/work/Tomcat/localhost/ROOT] is not valid....Caused by: java.io.IOException: The temporary upload location [/tmp/tomcat.5454715517323162300.8031/work/Tomcat/localhost/ROOT] is not valid

報錯截圖:

二、思路

CentOS 7 系統有一個預設定時器會每隔 1 天執行一次臨時目錄清理操作,把 /tmp 目錄下所有超過 10 天沒有任何變動的子目錄全部刪除。

若某個 Logwire 系統的使用者操作不太活躍,則 tomcat 執行臨時目錄(形如: /tmp/tomcat.xxx)會被刪除。這時候如果有使用者試圖上傳檔案,則服務端會報錯:

The temporary upload location [/tmp/tomcat.5454715517323162300.8031/work/Tomcat/localhost/ROOT] is not valid

三、處理過程

在 /usr/lib/tmpfiles.d/tmp.conf 檔案中增加配置項:

x /tmp/tomcat*

以上配置表示在清理臨時目錄時忽略所有以 /tmp/tomcat 開頭的目錄和檔案

四、CentOS系統的/tmp目錄自動清理規則

1、CentOS 7

CentOS7下,系統使用systemd管理易變與臨時檔案,與之相關的系統服務有3個:

systemd-tmpfiles-setup.service :Create Volatile Files and Directoriessystemd-tmpfiles-setup-dev.service:Create static device nodes in /devsystemd-tmpfiles-clean.service :Cleanup of Temporary Directories

相關的配置檔案也有3個地方:

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

/tmp目錄的清理規則主要取決於/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 overridev /tmp 1777 root root 10d # 清理/tmp下10天前的目錄和檔案v /var/tmp 1777 root root 30d # 清理/var/tmp下30天前的目錄和檔案 # Exclude namespace mountpoints created with PrivateTmp=yesx /tmp/systemd-private-%b-*X /tmp/systemd-private-%b-*/tmpx /var/tmp/systemd-private-%b-*X /var/tmp/systemd-private-%b-*/tmp

也就是CentOS 7 系統有一個預設定時器會每隔 1 天執行一次臨時目錄清理操作,把 /tmp 目錄下所有超過 10 天沒有任何變動的子目錄全部刪除。

可以配置這個檔案,比如你不想讓系統自動清理/tmp下以tomcat開頭的目錄,那麼增加下面這條內容到配置檔案中即可:

x /tmp/tomcat.*

2、CentOS 6

CentOS6以下系統(含)使用watchtmp + cron來實現定時清理臨時檔案的效果,該目錄下的指令碼每天執行一次。

如果要修改的話,可以修改此 tmpwatch 指令碼(用 root 使用者修改或其他使用者 sudo 修改):

找到類似該語句:

/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_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \\10d /tmp

為該語句新增 -X '/tmp/tomcat*' 引數,以便在清除時忽略所有以 /tmp/tomcat 開頭的目錄和檔案:

/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_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \\-X '/tmp/tomcat*' \\10d /tmp

覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

最新評論
  • 1 #

    怎麼知道查這個配置檔案呢?哪裡搜尋到?

  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 關於程式碼設計的幾點思考