为什么“systemd-tmpfiles --clean”不起作用?

为什么“systemd-tmpfiles --clean”不起作用?

我有以下配置来清理临时文件(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、 以及xand X(它们的存在只是为了从清理中排除特定的事物)。其中与正常用例相关的只是dand 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

它的作用(我希望)是:

  1. /foo/tmp删除atime、mtime、ctime均超过7天的文件和目录。
  2. 重新启动时不要删除内容。
  3. 如果该目录不存在,则创建它(它总是会存在。)
  4. 不要更改目录的所有权和权限(Mode、UID 和 GID 均设置为-

r我认为由于年龄原因不用于删除文件是非常令人困惑的。从手册页:

年龄字段仅适用于以 d、D、e、v、q、Q、C、x 和 X 开头的行。

相关内容