linux 下tmp目錄檔案怎麼被刪除的?

NO IMAGE

tmp目錄下檔案什麼時候會刪除?

寫這篇文章是我要重啟長時間執行的hadoop叢集的時候,關閉不了相應的服務。檢視shell指令碼看到,要找到服務的pid檔案,才能重啟,一般情況下pid檔案都會儲存在tmp目錄下,但是pid檔案卻不見了

為了保證tmp目錄不爆滿,系統預設情況下每日會處理一次tmp目錄檔案,原理就是使用了tmpwatch。

tmpwatch 作用

tmpwatch作用:removes files which haven’t been accessed for a period of time
刪除指定的目錄中一段時間未訪問的檔案。

tmpwatch 命令安裝

如果不是完全安裝,系統中一般不會有tmpwatch的命令,可以手動安裝;

yum install tmpwatch

tmpwatch命令引數

語法
tmpwatch [-afqv][--test][超期時間][目錄...]
一些tmpwatch引數
-u, --atime 基於訪問時間來刪除檔案,預設的。
-m, --mtime 基於修改時間來刪除檔案。
-c, --ctime 基於建立時間來刪除檔案,對於目錄,基於mtime。
-M, --dirmtime 刪除目錄基於目錄的修改時間而不是訪問時間。
-a, --all 刪除所有的檔案型別,不只是普通檔案,符號連結和目錄。
-d, --nodirs 不嘗試刪除目錄,即使是空目錄。
-d, --nosymlinks 不嘗試刪除符號連結。
-f, --force 強制刪除。
-q, --quiet 只報告錯誤資訊。
-s, --fuser 如果檔案已經是開啟狀態在刪除前,嘗試使用“定影”命令。預設不啟用。
-t, --test 僅作測試,並不真的刪除檔案或目錄。
-U, --exclude-user=user 不刪除屬於誰的檔案。
-v, --verbose 列印詳細資訊。
-x, --exclude=path 排除路徑,如果路徑是一個目錄,它包含的所有檔案被排除了。如果路徑不存在,它必須是一個絕對路徑不包含符號連結。
-X, --exclude-pattern=pattern 排除某規則下的路徑。

如果系統中已經安裝了tmpwatch,在/etc/cron.daily/目錄下有一個tmpwatch指令碼檔案,我電腦中指令碼檔案的內容如下:

[[email protected] conf]# more /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

從程式碼中可看出,會刪除tmp目錄下10天未訪問過的檔案,同時從指定的目錄中遞迴地搜尋並刪除指定目錄中一段時間未訪問的檔案。
注:上面的指令碼檔案是每天的定時任務,如果想刪除兩小時內未被訪問或者修改的檔案,不能在這個指令碼里面修改,因為這個指令碼的執行週期1天。你可以直接使用如下命令去實現“刪除 xxx 天沒有被訪問/修改過的檔案”

tmpwatch 20 /tmp/

如果不寫單位,預設是小時,上面是刪除20小時沒有被訪問/修改過的檔案。

tmpwatch給我們帶來的問題?

系統中很多服務的pid的檔案都會存放在/tmp目錄下,從上面指令碼檔案可以看到系統會定期刪除未被訪問的檔案,這樣就會導致很多服務無法正常關閉等現象。

解決方法

可以使用-U引數,進行排除

-U, --exclude-user=user
Don't remove files owned by user, which can be an user name or numeric user ID.

具體引數請使用man tmpwatch檢視。