【Linux】tmpfile 使用介绍

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]提到,自从2.26版本开始,glibc的open()函数使用了openat()系统调用,而不再使用内核的open()系统调用。在某些架构上,这也适用于2.26版本之前的glibc版本。引用\[2\]展示了一个使用open()函数的示例代码,其中使用了O_PATH标志来打开一个文件,并通过/proc/self/fd/路径来执行该文件。引用\[3\]提到,O_TMPFILE需要底层文件系统的支持,只有一部分Linux文件系统提供了这种支持,包括ext2、ext3、ext4、UDF、Minix和shmem文件系统。随后,其他文件系统也陆续添加了对O_TMPFILE的支持,如XFS(Linux 3.15)、Btrfs(Linux 3.16)、F2FS(Linux 3.16)和ubifs(Linux 4.9)。 综上所述,Linux函数open()是用于打开文件的函数。在最新的glibc版本中,open()函数使用了openat()系统调用。可以使用不同的标志来指定打开文件的方式,如O_PATH标志用于打开一个文件,并通过/proc/self/fd/路径来执行该文件。而O_TMPFILE标志需要底层文件系统的支持,只有部分Linux文件系统提供了这种支持。 #### 引用[.reference_title] - *1* *2* *3* [linux open函数详解](https://blog.csdn.net/yjj350418592/article/details/121908427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值