linux tmp清理這些事

tmp目錄

首先看下FHS的定義。html

FHS(Filessystem Hierarchy Standard) 的重點在於規範每一個特定的目錄下應該要放置什麼樣子的數據。node

tmp約定的存放內容linux

/tmp 這是讓通常用戶或者正在執行的程序暫時放置文件的地方。這個目錄是任何人都可以訪問,因此你須要按期清理一下。固然,重要數據不可放置在此目錄。由於FHS甚至建議在開機時,應該要將/tmp下的數據都刪除shell

清理方式

不一樣的 Linux 發行版其實對 /tmp 目錄的清理方式有所不一樣:緩存

  · 在 Debian-like 的系統,啓動的時候纔會清理 (規則定義在 /etc/default/rcS )安全

  · 在 RedHat-like 的系統,按文件存在時間定時清理 (RHEL6 規則定義在 /etc/cron.daily/tmpwatch ; RHEL7 以及 RedHat-like with systemd 規則定義在 /usr/lib/tmpfiles.d/tmp.conf , 經過 systemd-tmpfiles-clean.service 服務調用)less

  · 在 CentOS 裏,也是按文件存在時間清理的 (經過 crontab 的配置 /etc/cron.daily 定時執行 tmpwatch 來實現)dom

  · 在 Gentoo 裏也是啓動清理,規則定義在 /etc/conf.d/bootmisc工具

tmpwatch

例子測試

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

語法

-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 排除某規則下的路徑。

crontab定時

cron工具是一個以系統服務的形式存在。經過/etc/rc.d/init.d 或者 /etc/init.d目錄下的啓動腳本crond來啓動。 也可能直接經過 service crond start 命令來啓動。

cron不停地檢查全部配置的任務在當前是否應該運行,任務運行的最小時間間隔是1分鐘,也就是說任務最頻繁只能每分鐘運行一次。

可用crontab -e命令來編輯,編輯的是/var/spool/cron下對應用戶的cron文件,也能夠直接修改/etc/crontab文件。具體格式以下:

  1. Minute Hour Day Month Week command

  2. 分鐘 小時 天 月 星期 命令

  3. 0-59 0-23 1-31 1-12 0-6 command

/var/log/cron 是crontab的日誌

具體的配置參考以下的目錄中的內容

/etc/cron.hourly

/etc/cron.daily

tmpfiles服務

系統使用systemd管理易變與臨時文件,與之相關的系統服務有3個:

systemd-tmpfiles-setup.service  :Create Volatile Files and Directories
systemd-tmpfiles-setup-dev.service:Create static device nodes in /dev
systemd-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文件的設定

對於不一樣目錄下的同名配置文件, 僅以優先級最高的目錄中的那一個爲準。 具體說來就是: /etc/ 的優先級最高、 /run/ 的優先級居中、 /usr/lib/ 的優先級最低。 軟件包應該將自帶的配置文件安裝在 /usr/lib/ 目錄中, 而 /etc/ 目錄僅供系統管理員使用。 全部的配置文件,不管其位於哪一個目錄中,都統一按照文件名的字典順序處理。 若是在多個配置文件中設置了同一個路徑(文件或目錄), 那麼僅以文件名最靠前(字典順序)的那一個爲準, 其餘針對同一個路徑的配置項將會做爲警告信息記錄到錯誤日誌中。 若是有兩行互爲先後綴, 那麼始終是先處理前綴、再處理後綴。 全部帶有shell風格通配符的行, 都在全部不帶通配符的行以後處理。 若是有多個操做符應用於同一個文件(例如 ACL, xattr, 文件屬性調整), 那麼將始終按固定的順序操做。 對於其餘狀況, 文件與目錄老是按照它們在配置文件中出現的順序處理。

若是系統管理員想要屏蔽 /usr/lib/ 目錄中的某個配置文件, 那麼最佳作法是在 /etc/ 目錄中 建立一個指向 /dev/null 的同名符號連接, 便可完全屏蔽 /usr/lib/ 目錄中的同名文件。

配置文件格式

配置文件的格式是每行對應一個路徑,包含以下字段: 類型, 路徑, 權限, 屬主, 屬組, 壽命, 參數


#Type Path       Mode UID GID Age Argument
d     /run/user   0755 root root 10d -
L     /tmp/foobar -   -   -   -   /dev/null

字段值能夠用引號界定,並能夠包含C風格的轉義字符。

類型(Type)

"類型"字段由一個單獨的、表示類型的字母與一個可選的感嘆號(!)組成。

能夠識別的類型以下:

  • f

    若指定的文件不存在,則建立它,不然什麼也不作。 若設置了"參數"字段,則將其內容寫入指定的文件。 不追蹤軟鏈接。

     

  • F

    若指定的文件不存在,則建立它,不然清空已有文件。 若設置了"參數"字段,則將其內容寫入指定的文件。不追蹤軟鏈接。

     

  • w

    若指定的文件存在,則將"參數"字段的內容寫入該文件,不然什麼也不作。 注意:不會在"參數"字段內容的末尾添加額外的換行符, 能夠在"參數"字段中使用C語言風格的轉義字符。 能夠在"路徑"字段中使用shell風格的通配符。 追蹤軟鏈接。

     

  • d

    建立指定的目錄並賦於指定的UID/GID與權限。 若是指定的目錄已經存在,那麼僅調整UID/GID與權限。 若是指定了"壽命"字段,那麼該目錄中的內容將遵照基於時間的清理策略。

     

  • D

    d 相似, 可是若是使用了 --remove 選項,那麼將會清空目錄中的全部內容。

     

  • e

    d 相似,可是並不建立本來不存在的目錄。 能夠在"路徑"字段中使用shell風格的通配符。 要想讓此類型有效,必須至少明確設置 權限, 屬主, 屬組, 壽命 字段之一。 若是"壽命"字段的值爲 "0" , 那麼每次運行 systemd-tmpfiles --clean 命令都會無條件的清空該目錄。 這個特性常常與 ! 一塊兒使用(參見後文的"例子"小節)。

     

  • v

    若是指定的路徑不存在, 而且該路徑位於一個Btrfs子卷中, 那麼按照指定的路徑建立子卷。 不然,建立一個普通的目錄(與 d 同樣)。 僅對Btrfs文件系統有意義。 此處建立的子卷不會被分配給任何 higher-level 配額組(quota group), 若是想要建立簡單的配額組層次關係, 那麼應該使用下面的 qQ

     

  • q

    v 相似, 但會將所建立的新子卷分配給父子卷(父目錄) 所屬的 higher-level 配額組(quota group)。 這樣能夠確保做用於父子卷(父目錄)的 higher-level 配額組 能夠包含此處建立的新子卷(子目錄)。 僅對Btrfs文件系統有意義, 在非Btrfs文件系統上與 d 等價。 若是指定的子卷(路徑)已經存在, 而且已經被分配給了一個或多個 higher-level 配額組,那麼不修改任何現有的配額層次關係。 參見下面的 Q 以及 btrfs-qgroup(8) 手冊,以瞭解更多關於btrfs的配額組(quota group)的概念。

     

  • Q

    q 相似, 但並不直接複用父子卷(父目錄)的 higher-level 配額組(quota group), 而是首先找到父子卷(父目錄)的 最低級非葉子配額組(也就是倒數第二級配額組), 而後在此配額組與最末端的葉子配額組之間, 插入一個level值減一的"中間配額組", 而且與新建的子卷共享同一個ID。 若是父子卷(父目錄)不存在 higher-level 配額組, 那麼插入一個level值爲255且ID與新建子卷相同的"中間配額組", 而且這個新建的"中間配額組"將被指定爲 父子卷(父目錄)的 higher-level 配額組(quota group), 同時,新建子卷的葉子配額組也會分配給它(中間配額組)。單就新建子卷自身而言, qQ 在實際效果上並沒有不一樣, 可是經過插入一個新的 higher-level 配額組, Q 能夠實現對該新建的子卷以及 將來建立在該子卷之下的下級子捲進行統一的配額限制。 這樣,在經過 qQ 建立子卷的同時,也一塊兒實現了一顆"配額子樹"。 每個 Q 建立的子卷都將擁有一個本身專屬的配額層次結構(配額子樹), 可用於容納未來建立的下級子卷。 每個 q 建立的子卷都沒有本身專屬的配額子樹, 其自身會被添加到直屬父子卷(父目錄)所屬的配額子樹中。Q 一般用於 /home/var/lib/machines 這樣的目錄, 其特色是: 不但須要包含多個下級子卷, 並且須要將全部下級子卷視爲一個總體進行配額限制。 q 一般用於 /var/var/tmp 這樣的目錄, 其特色是: 要麼不須要包含下級子卷, 要麼不須要將全部下級子卷視爲一個總體進行配額限制。 與 q 同樣,Q 也不會改變任何已經存在的配額層次關係,也就是說, 若是指定的子卷(路徑)已經存在,而且已經被分配給了一個或多個 higher-level 配額組, 那麼不修改任何現有的配額層次關係。

     

  • p, p+

    若指定的管道(FIFO)不存在,則建立它,不然什麼也不作。 後綴 + 表示:若指定的路徑已存在一個非管道文件, 則先刪除此文件再建立指定的管道文件。

     

  • L, L+

    若指定的軟鏈接不存在,則建立它,不然什麼也不作。 後綴 + 表示: 若指定的路徑已存在一個非軟鏈接文件或目錄, 則先刪除此文件或目錄再建立指定的軟鏈接。 若"參數"字段爲空, 那麼將建立一個指向 /usr/share/factory/ 目錄中同名文件的軟鏈接。 注意,軟鏈接的UID/GID與權限將被忽略。

     

  • c, c+

    若指定的字符設備不存在,則建立它,不然什麼也不作。 後綴 + 表示: 若指定的路徑已存在一個非字符設備的文件, 則先刪除此文件再建立指定的字符設備。 由於udev並無論理運行時建立的靜態設備節點, 因此建議在末尾加上"!",以確保僅在系統啓動期間才建立此靜態設備節點。

     

  • b, b+

    若指定的塊設備不存在,則建立它,不然什麼也不作。 後綴 + 表示: 若指定的路徑已存在一個非塊設備的文件, 則先刪除此文件再建立指定的塊設備。 由於udev並無論理在運行時建立的靜態設備節點, 因此建議在末尾加上"!",以確保僅在系統啓動期間才建立此靜態設備節點。

     

  • C

    若指定的文件或目錄不存在, 則遞歸的從"參數"字段所指定的文件或目錄複製, 不然什麼也不作。 若"參數"字段爲空, 那麼將從 /usr/share/factory/ 目錄中 遞歸的複製同名文件或目錄。 不追蹤軟鏈接。

     

  • x

    在根據"壽命"字段清理過時文件時, 忽略指定的路徑及該路徑下的全部內容。 能夠在"路徑"字段中使用shell風格的通配符。 注意,這個保護措施對 rR 無效。

     

  • X

    在根據"壽命"字段清理過時文件時, 僅忽略指定的路徑自身而不包括該路徑下的其餘內容。 能夠在"路徑"字段中使用shell風格的通配符。 注意,這個保護措施對 rR 無效。

     

  • r

    若指定的文件或目錄存在,則刪除它。 不可用於非空目錄。 能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。

     

  • R

    若指定的文件或目錄存在,則遞歸的刪除它。 可用於非空目錄。能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。

     

  • z

    若指定的文件或目錄存在, 則僅設置其自身的訪問權限、屬主、屬組、重置SELinux安全上下文。 能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。

     

  • Z

    若指定的文件或目錄存在, 則遞歸的設置其訪問權限、屬主、屬組、重置SELinux安全上下文。 能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。

     

  • t

    若指定的文件或目錄存在, 則僅設置其自身的SMACK標籤。 能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。

     

  • T

    若指定的文件或目錄存在, 則遞歸的設置其SMACK標籤。 能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。

     

  • h

    若指定的文件或目錄存在,則僅調整其自身的屬性。 能夠在"路徑"字段中使用shell風格的通配符。"參數"字段的格式是 [+-=][aAcCdDeijsStTu], 具體解釋以下: + 前綴表示添加屬性(這是默認值); - 前綴表示去除屬性; = 前綴表示設置屬性(但對 "aAcCdDeijsStTu" 範圍以外的其餘屬性沒有影響); 然後綴字母 "aAcCdDeijsStTu" 則用於表示各類屬性, 其含義與 chattr(1) 手冊裏的解釋一致。注意,將"參數"字段設爲一個單獨的 =(無後繼字母) 表示重置全部 "aAcCdDeijsStTu" 表明的屬性。 不追蹤軟鏈接。

     

  • H

    若指定的文件或目錄存在,則遞歸的調整其屬性。 能夠在"路徑"字段中使用shell風格的通配符。 不追蹤軟鏈接。"參數"字段的語法與 h 徹底相同。

     

  • a, a+

    若指定的文件或目錄存在, 則僅設置其自身的訪問控制列表(POSIX ACL)。 能夠在"路徑"字段中使用shell風格的通配符。 後綴 + 表示將指定的項添加到已有的訪問控制列表中。 除非基本權限已經存在或被明確指定, 不然 systemd-tmpfiles 將會自動根據"權限","屬主","屬組"字段添加所需的基本權限。 若是沒有明確指定訪問控制列表或者訪問控制列表已經存在, 那麼將會疊加上掩碼。 不追蹤軟鏈接。

     

  • A, A+

    若指定的文件或目錄存在,則遞歸的設置訪問控制列表(POSIX ACL)。 其餘與 a/a+ 徹底相同。 不追蹤軟鏈接。

使用了感嘆號(!)標記的行,僅可用於系統啓動過程當中, 禁止用於運行中的系統(會破壞系統的正常運行)。 未使用感嘆號(!)標記的行, 能夠在任意時間安全的執行(例如升級軟件包的時候)。 systemd-tmpfiles 僅在明確使用了 --boot 選項的時候纔會執行使用了感嘆號(!)標記的行。

例如:

# 確保默認建立此目錄
d /tmp/.X11-unix 1777 root root 10d

# 僅在系統啓動時清理X11的鎖文件(但在運行時禁止刪除這些文件)
r! /tmp/.X[0-9]*-lock

本例中的第二行僅在明確使用了 --boot 選項的時候纔會執行, 由於它會破壞正在運行中的系統。 可是第一行則無此限制,能夠在任什麼時候候執行都不會對系統形成損害。

路徑(Path)

"路徑"字段是指文件系統路徑, 而且支持幾個簡單的替換標記:

表 1. 可用於替換的標記

標記
含義
解釋

"%m"
Machine ID
系統的"Machine ID"字符串。參見 machine-id(5) 手冊。

"%b"
Boot ID
系統的"Boot ID"字符串。參見 random(4) 手冊。

"%H"
Host name
系統的主機名(hostname)

"%v"
Kernel release
內核版本(uname -r 的輸出)

"%%"
Escaped %
百分號自身(%)。使用"%%"表示一個真正的"%"字符。

權限(Mode)

"權限"字段表示設置文件或目錄的權限, 若是省略或設爲 "-" 則表示使用默認權限, 也就是:對於目錄使用"0755"、對於文件使用"0644", 但對於 z, Z 表示不修改現有的權限。 此字段對於 x, r, R, L, t, a 沒有意義。

可選前綴 "~" 的含義是掩碼, 也就是將此字段看成權限掩碼來使用。 換句話說,就是將此字段設置的值與現有的權限作"位與"運算。 舉例來講,假設原有文件的權限是"0765",此字段的值是"~1550", 那麼文件的最終權限將是"0540"。 若是省略了 sticky/SUID/SGID 位, 那麼對於文件來講至關於所有清除, 而對於目錄來講則至關於保持不變。 例如"~550",對於文件來講至關於"~0550", 而對於目錄來講則至關於"~7550"。 此特性在實踐中僅對 Z 有實際價值。

屬主,屬組(UID,GID)

"屬主"與"屬組"字段分別表示文件或目錄的所屬用戶與所屬用戶組。 能夠設爲數字形式的UID/GIU值,也能夠設爲字符串形式的用戶名稱/組名稱。 若是省略或者設爲 "-" 則表示使用默認值"0"(root)。 但對於 zZ 來講,省略或者設爲 "-" 則表示不修改現有的"屬主"與"屬組"。 此字段對於 x, r, R, L, t, a 沒有意義。

壽命(Age)

"壽命"字段用於斷定在清理過時文件或子目錄時應該刪除哪些, 也就是決定了文件或子目錄的"壽命"。 若是文件或子目錄的最後改動時間(ctime) 與當前系統時間之差已經大於"壽命"字段的值, 那麼這些文件或子目錄將被刪除。 此字段的值是一個時間長度, 可使用下面的時間單位後綴: us(微秒), ms(毫秒), s(秒), m(分), h(時), d(天), w(周)。

能夠同時使用多個時間單位, 例如"5m10s"表示5分10秒(也就是310秒)。 若是省略了時間單位,那麼表示使用默認單位"秒"。

若是將此字段設爲數字"0", 那麼表示在每次清理時都無條件的刪除全部文件或子目錄。

此字段僅對 d, D, e, v, q, Q, C, x, X 有意義。若是省略此字段或將其設爲 "-" ,那麼表示不進行任何清理。

若是此字段的值以 "~" 開頭, 那麼表示在每次清理時都無條件的保留指定目錄直屬的文件與子目錄, 也就是僅清理直屬子目錄下的內容。

參數(Argument)

"參數"字段對不一樣的"類型"有不一樣的做用: 對於 L 來講,用於指定軟鏈接的目標路徑。 對於 c, b 來講, 用於以"主設備號:次設備號"的格式設定設備節點的主/次設備號(十進制整數), 例如 "1:3" 。 對於 f, F, w 來講, 用於設置一個寫入文件的短字符串(實際寫入時會在末尾附加一個換行符)。 對於 C 來講,用於指定源文件或者源目錄。 對於 t, T 來講, 用於指定將要設置的擴展屬性。 對於 a, A 來講,用於指定將要設置的ACL屬性。 對於 h, H 來講,用於指定將要設置的文件屬性。 對於其餘類型無心義,將被忽略。

例子

例 1. 按照指定的UID/GID與權限建立目錄

screen(1) 須要在系統啓動時按照指定的屬主/屬組/權限建立兩個目錄


# /usr/lib/tmpfiles.d/screen.conf
d /run/screens 1777 root screen 10d
d /run/uscreens 0755 root screen 10d12h

/run/screens 中超過10天的內容將被清理。 /run/uscreens 中超過10.5天的內容將被清理。

例 2. 建立一個帶有 SMACK 屬性的目錄


D /run/cups - - - -
t /run/cups - - - - security.SMACK64=printing user.attr-with-spaces="foo bar"
     

該目錄的屬主將是"root"而且會被賦予默認權限。 目錄中的內容將不會被按期清理,但可以使用 systemd-tmpfiles --remove 命令清除。

例 3. 建立一個不會被按期清理的目錄

abrt(1) 須要在系統啓動時按照指定的屬主/屬組/權限建立一個目錄, 而且禁止清理 /var/tmp 目錄


# /usr/lib/tmpfiles.d/tmp.conf
d /var/tmp 1777 root root 30d

# /usr/lib/tmpfiles.d/abrt.conf
d /var/tmp/abrt 0755 abrt abrt -

例 4. 啓用系統啓動過程當中的清理,以及基於時間的清理


# /usr/lib/tmpfiles.d/dnf.conf
r! /var/cache/dnf/*/*/download_lock.pid
r! /var/cache/dnf/*/*/metadata_lock.pid
r! /var/lib/dnf/rpmdb_lock.pid
e /var/cache/dnf/ - - - 30d

系統啓動過程當中將會清理 lock 文件。 /var/cache/dnf/ 目錄中閒置超過30天的內容將會被刪除。

例 5. 在啓動時清空緩存目錄


# /usr/lib/tmpfiles.d/krb5rcache.conf
e! /var/cache/krb5rcache - - - 0

在啓動時清空 /var/cache/krb5rcache/ 下的全部內容。即便此目錄不存在也不會建立它。

相關文章
相關標籤/搜索