借助systemd-tmpfiles定期清理临时文件

1. 简介

systemd-tmpfiles 是Linux系统中用于管理临时文件和目录的一个工具,是systemd套件的一部分。它提供了一种结构化的、可配置的方法来创建、删除和清理临时文件和目录,以确保系统的整洁和安全性。

systemd-tmpfiles的配置文件通常位于以下几个目录中,它们的优先级从上到下依次为:

  • /etc/tmpfiles.d/*.conf:系统管理员可以修改的配置文件。
  • /run/tmpfiles.d/*.conf:由守护进程(daemon)自己管理的配置文件,不建议普通用户更改。
  • /usr/lib/tmpfiles.d/*.conf:在软件安装时自动更新的配置文件,不建议普通用户更改。

配置文件时用于配置临时目录的路径和属性。格式通常包括文件或目录类型(type)、路径(path)、权限(mode)、用户(UID)、用户组(GID)、生存时间(AGE)等字段。
关于systemd-tmpfiles选项和tmpfiles.d配置文件格式的详解,见第三章节——详细资料。

2. 直接实操——配置一个临时目录

2.1 实现目标

假设我们的服务器上有一个服务,会产生一些临时文件。我们设置将这些临时文件保存在目录/opt/jr/tmp/opt/dd/tmp中。那么我们现在希望以上两个目录临时文件能定期自动地被清理,且/opt/dd/tmp中的文件至少保存1分钟以上,/opt/dd/tmp可以尽快删除。
实现方法:借助systemd-tmpfiles实现。

2.2 第一步:配置临时目录

我们作为管理者,就选择在/etc/tmpfiles.d/下创建我们的配置文件jr-tmp.conf
在文件/etc/tmpfiles.d/jr-tmp.conf中编辑以下内容。

# 该目录中寿命超过1min的文件在命令systemd-tmpfile --clean被执行时将被删除
d /opt/dd/tmp 1750 root root 1min
# 该目录中的文件在命令systemd-tmpfile --remove被执行时将被删除
D /opt/jr/tmp 1750 root root

2.3 第二步:尝试手动执行systemd-tmpfiles命令创建、清理临时目录

执行以下命令,我们在tmpfiles.d目录下的配置文件便会被读取,创建目录/opt/jr/tmp/opt/dd/tmp

systemd-tmpfiles --create

分别在两个临时目录中创建一些文件。

jr-02:/etc/tmpfiles.d # ll /opt/dd/tmp/
total 0
-rw-r----- 1 root root 0 Jul 11 19:37 t1
-rw-r----- 1 root root 0 Jul 11 19:37 t2

jr-02:/etc/tmpfiles.d # ll /opt/jr/tmp/
total 0
-rw-r----- 1 root root 0 Jul 11 19:36 t1
-rw-r----- 1 root root 0 Jul 11 19:36 t2

立即执行命令systemd-tmpfiles --remove --clean。可以观察到,目录/opt/jr/tmp中的文件被删除。而/opt/dd/tmp中的文件还在,因为其中的文件创建时间还不到1分钟。

jr-02:/etc/tmpfiles.d # ll /opt/jr/tmp/
total 0

jr-02:/etc/tmpfiles.d # ll /opt/dd/tmp/
total 0
-rw-r----- 1 root root 0 Jul 11 19:37 t1
-rw-r----- 1 root root 0 Jul 11 19:37 t2

1分钟后,再次执行命令systemd-tmpfiles --remove --clean。可以观察到目录/opt/dd/tmp中的文件已被删除。
上述测试结果和配置文件/etc/tmpfiles.d/jr-tmp.conf中对两个临时目录的配置效果是一致的。

2.4 第三步:定时器会按照我们配置的规则清理临时目录

有了第一步的配置,我们大可不必再手动执行命令取清理临时目录。在linux系统中(至少ubuntu和Euler是有的),有一个专门定时清理临时目录的定时器/usr/lib/systemd/system/systemd-tmpfiles-clean.timer配置了清理临时目录的周期。其中配置的执行周期是1天,太长了,我们想改为3min。复制该.timer到/etc/systemd/system/中,在/etc/systemd/system/systemd-tmpfiles-clean.timer中修改定时执行周期为3min。因为/etc/systemd/system/目录中服务单元的优先级最高,所以该目录下的systemd-tmpfiles-clean.timer生效,而/usr/lib/systemd/system/systemd-tmpfiles-clean.timer不再生效。

[Unit]
Description=Daily Cleanup of User's Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)

[Timer]
OnStartupSec=5min
# 每分钟清理一次临时目录。一般1天(1d),我设置3分钟是为了快速观察到测试效果
OnUnitActiveSec=3min

[Install]
WantedBy=timers.target

执行以下命令,使修改的定时器生效。

systemctl daemon-reload  # 重新加载systemd

在目录/opt/dd/tmp中创建一些文件,4分钟以后再观察目录/opt/dd/tmp下没有文件。说明我们成功了。

这个定时器是调用什么服务清理临时目录呢?从以上内容可见,该定时器并没有使用"Unit"选项指定它要启动的服务单元。那么它就是默认匹配与该.timer单元名称相同的 .service 单元(不算后缀)。
/usr/lib/systemd/system/目录中确实有一个与该timer同名的服务单元systemd-tmpfiles-clean.service。打开这个service文件,可以看到其指定的要执行命令为systemd-tmpfiles --clean。也就是说,这个服务单元会被周期性地启动,即周期性地执行systemd-tmpfiles --clean命令,以实现定期清理临时目录的目的。不过该命令中不带--remove选项,不能实现对/opt/jr/tmp的清理。

[Unit]
Description=Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs.target time-set.target
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=systemd-tmpfiles --clean
SuccessExitStatus=DATAERR
IOSchedulingClass=idle

为了实现对/opt/jr/tmp的定时清理,复制/usr/lib/systemd/system/systemd-tmpfiles-clean.service/etc/systemd/system/,将选项ExecStart修改如下。

ExecStart=systemd-tmpfiles --clean --revove

再执行systemctl daemon-reload以加载我们刚修改的service单元/etc/systemd/system/systemd-tmpfiles-clean.service
至此,/opt/jr/tmp目录也会被定时清理了。

3. 详细资料

要详细了解systemd-tmpfiles各个选项参数和和tmpfiles.d配置文件的参数,直接看man page或者谷歌搜索就能搜索到英文手册,也可以查阅这本中文翻译手册《systemd.index 中文手册》(这大哥真挺厉害,有耐心翻译一本手册)。
为获取相关man page,可在系统上执行以下命令。

man systemd-tmpfiles

man tmpfiles.d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值