热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Linux】tmpfile使用介绍

tmpfile使用介绍1介绍很多情况下,需要系统自动识别tmp、vartmp下的临时目录,并将其自动清理其中的过期文件。这个工具就是systemd-

tmpfile 使用介绍

1 介绍

很多情况下,需要系统自动识别/tmp、/var/tmp下的临时目录,并将其自动清理其中的过期文件。这个工具就是systemd-tmpfiles。

网上很多博客使用tmpwatch+cron的方法来管理临时文件和临时存放文件的目录,在后期的版本中都已经修改为使用systemd-tmpfiles+systemd-tmpfiles-timers替换早期版本。

2 systemd-tmpfiles

systemd提供了一个结构化的可配置方法来管理临时文件和目录,即systemd-tmpfiles,可以创建、删除和管理临时文件的服务。旧版本系统使用watchtmp+cron来共同实现管理临时文件。

systemd启动后,其中一个启动的服务单元是systemd-tmpfiles-setup,该服务的命令为:systemd-tmpfiles --creat/–clean *conf , *conf是可选的,不写默认是使用所有配置文件。

  • /etc/tmpfiles.d/*conf ,管理员可修改的配置文件

  • /run/tmpfiles.d/*conf ,daemon应用程序自己管理的配置文件,不建议更改

  • /usr/lib/tmpfiles.d/*conf,rpm软件安装时,自动更新的配置文件,不能更改


3 查看服务状态


systemctl status systemd-tmpfiles*
● systemd-tmpfiles-setup-dev.service - Create Static Device Nodes in /dev
Loaded: loaded (/lib/systemd/system/systemd-tmpfiles-setup-dev.service; static; vendor preset: enabled)
Active: active (exited) since Tue 2023-01-31 15:37:13 CST; 6 days ago
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Process: 332 ExecStart=/bin/systemd-tmpfiles --prefix=/dev --create --boot (code=exited, status=0/SUCCESS)
Main PID: 332 (code=exited, status=0/SUCCESS)
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
Loaded: loaded (/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: enabled)
Active: active (waiting) since Tue 2023-01-31 15:37:15 CST; 6 days ago
Trigger: Tue 2023-02-07 15:52:14 CST; 23h left
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
● systemd-tmpfiles-setup.service - Create Volatile Files and Directories
Loaded: loaded (/lib/systemd/system/systemd-tmpfiles-setup.service; static; vendor preset: enabled)
Active: active (exited) since Tue 2023-01-31 15:37:14 CST; 6 days ago
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Process: 648 ExecStart=/bin/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev (code=exited, status=0/SUCCESS)
Main PID: 648 (code=exited, status=0/SUCCESS)
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

4 systemd-tmpfiles-clean.timer

systemd-tmpfiles-clean.timer 计时器,是代替cron来完成定时清理的工作。

上一章节中,可以看到使用systemctl status systemd-tmpfiles-clean.timer 可以获取到进程状态

那么如何来设置并查看剩余倒计时的呢?

4.1 /usr/lib/systemd/system/systemd-tmpfiles-clean.timer

通过文件/usr/lib/systemd/system/systemd-tmpfiles-clean.timer 可以设置计时器的时间触发间隔,如下文所示:

cat /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
\# SPDX-License-Identifier: LGPL-2.1+
\#
\# 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 ## 开机15分钟后执行
OnUnitActiveSec=1d ## 离上次执行服务1天后再次执行

通过设置配置文件并重新加载配置,使其生效。


sudo systemctl daemon-reload
sudo systemctl enable --now systemd-tmpfiles-clean.timer

4.2 systemctl list-timer

查看剩余触发间隔,可以使用命令查看

systemctl list-timers | grep tmpfile
Tue 2023-02-07 15:52:14 CST 23h left Mon 2023-02-06 15:52:14 CST 25min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

5 tmpfile配置文件的格式说明

以/usr/lib/tmpfiles.d/tmp.conf文件为例:


cat 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
D /tmp 1777 root root -
\#q /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
\# Remove top-level private temporary directories on each boot
R! /tmp/systemd-private-*
R! /var/tmp/systemd-private-*

解释:

type代表类型,path代表路径,mode代表权限,UID用户, GID用户组,AGE生存时间,Argument代表附加参数。

常见的type类型有:

类型说明
f如果文件不存在,则创建该文件。如果给出了参数参数,并且文件还不存在,它将被写入文件。不遵循符号链接。
F创建或截断文件。如果给出了参数参数,它将被写入文件。不遵循符号链接。
d创建目录。如果指定了模式和所有权,将进行调整。如果指定了age参数,则此目录的内容将进行基于时间的清理。
D类似于d,但是在使用——remove时,目录的内容将被删除
v如果路径还不存在,则创建子卷,文件系统支持子卷(btrfs),并且系统本身安装在子卷中(具体来说:根目录/本身就是子卷)。否则,创建一个普通目录,方法与d相同。
x在清理过程中忽略路径。使用此类型可以排除由Age参数控制的清理路径。注意,这种类型的行不影响r或r行的效果。这种类型的行可以接受
X在清理过程中忽略路径。使用此类型可以排除由Age参数控制的清理路径。与x不同的是,如果path是一个目录,此参数将不排除内容,而只排除目录本身。
r删除存在的文件或目录。这可能不用于删除非空目录,使用R。这种类型的行接受shell样式的glob来代替正常的路径名。不遵循符号链接
R递归地删除路径及其所有子目录(如果它是目录)。这种类型的行接受shell样式的glob来代替正常的路径名。不遵循符号链接。
z调整访问模式、用户和组所有权,并恢复文件或目录的SELinux安全上下文(如果存在)。这种类型的行接受shell样式的glob来代替正常的路径名。不遵循符号链接。
Z递归地设置访问模式、用户和组所有权,并恢复文件或目录(如果存在)及其子目录和其中包含的文件(如果适用)的SELinux安全上下文。
t设置扩展属性。这种类型的行接受shell样式的glob来代替正常的路径名。这对于设置SMACK标签很有用。不遵循符号链接。
T递归地设置扩展属性。这种类型的行接受shell样式的glob来代替正常的路径名。这对于设置SMACK标签很有用。不遵循符号链接。
更多选项使用命令 man 5 tmpfile 查看具体类型使用方法。


6 手动清理文件

手动清理临时文件

配置systemd-tmpfiles来清理/testtmp目录,这将确保目录不包含最近3天未使用过的文件。

可以复制示例配置/usr/lib/tmpfiles.d/tmp.conf文件并进行更新。

如下编辑文件:


$ sudo vim /etc/tmpfiles.d/testtmp.conf
See tmpfiles.d(5) for details
\# Clear tmp directories separately, to make them easier to override
q /testtmp 1777 root root 3d
如果要确保拥有正确所有权的直接性,请创建如下配置:
d /run/testtmp 0700 root root 60s
必须清除该目录中最近60秒钟内未使用的任何文件。
创建文件后,使用以下命令确保文件包含适当的配置:
sudo systemd-tmpfiles --create /etc/tmpfiles.d/testtmp.conf
如果在输出中看不到任何错误,则表明配置设置正确,可以随时使用以下命令调用手动清理:
systemd-tmpfiles --clean /etc/tmpfiles.d/testtmp.conf






推荐阅读
author-avatar
咸咸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有