我有以下配置来清理临时文件(CentOS 7 的默认设置),它表示/tmp
如果文件超过 10 天,则应将其删除。
[root]# tail -n +10 /usr/lib/tmpfiles.d/tmp.conf | head -n 3
# Clear tmp directories separately, to make them easier to override
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
然而,即使在运行后systemd-tmpfiles --clean
,当我查看 的内容时/tmp
,其中也有超过 10 天的文件。
[root]# ls -dl /tmp/backup-inspection
drwxr-xr-x 8 root root 68 Aug 29 2014 /tmp/backup-inspection
该目录的内容/tmp
非常庞大:
[root]# du -h /tmp | tail -n 1
3.5G /tmp
谁能向我解释为什么该backup-inspection
目录没有被删除?已经快1岁了吗?
答案1
我最近遇到了同样的问题,并发现了这个问题,所以我分享我的经验。
实际上,systemd-tmpfiles
正如您所期望的那样,完全支持递归目录树处理(另一个答案让我很困惑,足以检查源代码)。文件未被删除的原因(就我而言)是atime
.systemd-tmpfiles
检查ctime
(目录除外),mtime
并且atime
所有三个(或两个)都必须足够旧才能删除文件(或目录)。
其实可能还有其他原因,因为systemd-tmpfiles
有很多跳过文件的内部规则。要找出某些文件未删除的原因,请运行systemd-tmpfiles
以下命令:
env SYSTEMD_LOG_LEVEL=debug systemd-tmpfiles --clean
它可能会将大量输出转储到您的控制台中。请注意,如果您尝试重定向stdout
到例如文件,输出将消失并被发送到 systemd 日志(以便可以通过 例如 获取它journalctl
)。就我而言,输出也在中间被切断(或者我只是不知道如何使用journalctl
),所以我的解决方案是暂时增加终端模拟器中的历史缓冲区。
答案2
最近我一直在竭尽全力解决我职权范围内服务器上的类似问题。
简单的答案基本上就是:systemd-tmpfiles --clean
真是一团糟,你应该寻找替代方案
不太简单的答案有点长。
systemd-tmpfiles
执行各种任务,但其主要任务与--clean
选项无关:确保系统状态在重新启动时适当“重置”。也就是说,它确保创建因各种原因需要存在的目录和文件,并删除不应该存在的目录和文件(以及一长串相对深奥的东西,例如创建文件系统子卷和配额、块设备等) .、更改权限、SELinux 属性等。如果您对所有内容感到好奇,请参阅联机帮助页)。这些任务由systemd-tmpfiles --create
(对于大多数事情)和systemd-tmpfiles --remove
(对于删除文件和目录)执行。这两个子命令粗略地考虑每个配置行的开始:第一个字段是操作类型,第二个字段是目标,第三个字段是模式等。通常,类似的内容systemd-tmpfiles --create --remove
会在系统启动后不久、在执行任何操作之前运行这可能取决于它采取的行动。需要注意的一件重要事情是,这些操作不会查看第五个参数,即 Age 参数。这就是--clean
进来的地方。
systemd-tmpfiles --clean
本质上是通过一个附加字段(Age 字段)搭载在该基础设施之上。不过,它只考虑其他子命令执行的一些特定类型的操作:d, D, v, q, Q, C
、 以及x
and X
(它们的存在只是为了从清理中排除特定的事物)。其中与正常用例相关的只是d
and D
,但用于目录、create-if-doesn't-exist 和create-if-doesn't-exist-or-emptying-if-it-does , 分别。标记年龄后,systemd-tmpfiles --clean
当年龄早于配置时,将删除列出的路径。
问题是:这实际上意味着仅列出的路径- 年龄标记不会递归地应用于文件夹的内容。这意味着您问题中的配置行只会删除整个/tmp
或/var/tmp
,并且只有在其中分别在 10 或 30 天内没有发生任何事情的情况下。更糟糕的是,除了x
和 之外,影响年龄的因素都不支持全局X
,它们用于排除清理中的东西。
联机tmpfiles.d
帮助页确实列出了一件有趣的事情,如果幸运的话,它可能适合您的情况:“如果年龄字段以波浪号字符“〜”开头,则清理仅应用于指定目录内一级的文件和目录,但不是其中紧邻的文件和目录。” - 对于我的情况,清理需要在以下两个级别进行/tmp
,因此无法使用它来达到良好的效果。
研究其他清理/tmp
目录内容的解决方案,这些解决方案将其视为其主要目的,而不是像现在这样添加到末尾systemd-tmpfiles --clean
。
答案3
d
用于创建目录r
用于删除文件
从tempfiles.d(5)
。您不需要其他东西,尝试:
d /tmp 1d
d
Create a directory if it does not exist yet.
D
Create or empty a directory.
r
Remove a file or directory if it exists. This may not be used to
remove non-empty directories, use R for that. Lines of this type
accept shell-style globs in place of normal path names. Does not
follow symlinks.
R
Recursively remove a path and all its subdirectories (if it is a
directory). Lines of this type accept shell-style globs in place
of normal path names. Does not follow symlinks.
答案4
我也在这个问题上挣扎了更长的时间。
我的情况是,我有一个自定义 tmp 目录(自定义应用程序需要,放置在快速 SSD 磁盘上),需要清除 7 天未使用的文件。
我最终做的是在/etc/tmpfiles.d
名为“foo.conf”的文件中创建一个文件,其中包含以下行:
d /foo/tmp - - - 7d
它的作用(我希望)是:
/foo/tmp
删除atime、mtime、ctime均超过7天的文件和目录。- 重新启动时不要删除内容。
- 如果该目录不存在,则创建它(它总是会存在。)
- 不要更改目录的所有权和权限(Mode、UID 和 GID 均设置为
-
)
r
我认为由于年龄原因不用于删除文件是非常令人困惑的。从手册页:
年龄字段仅适用于以 d、D、e、v、q、Q、C、x 和 X 开头的行。