Syn*_*ted 18 linux filesystems tmpfs
我的 tmpfs /tmp 使用 RAM,准确地说是 2GB。通常,这已经足够了,但有时,进程会在其中创建文件并且无法自行清理。如果它们崩溃,就会发生这种情况。我需要删除这些孤立的 tmp 文件,否则未来的进程将耗尽 /tmp 上的空间。
我怎样才能安全地垃圾收集/tmp?有些人通过检查上次修改时间戳来做到这一点,但这种方法是不安全的,因为可能有长时间运行的进程仍然需要这些文件。一种更安全的方法是将最后修改时间戳条件与没有进程具有该文件的文件句柄的条件结合起来。是否有一个程序/脚本/等体现了这种方法或其他一些也安全的方法?
顺便说一句,Linux/Unix 是否允许在创建时打开文件的模式,其中创建的文件在创建过程终止时被删除,即使它是崩溃的?
小智 18
你可能想尝试这样的事情:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find 用于查找符合特定条件的文件。
-mtime +7 仅选择超过 7 天的文件(您可以使用任何其他值)-exec fuser -s {} ';'为每个符合旧条件的文件在静默模式下调用 fuser。fuser 为现在已访问的每个文件返回 0 (=true),为未访问的文件返回 1 (= false)。因为我们只对未访问的感兴趣,所以我们-not在这前面放了一个-exec-exec echo {} ';'只打印符合条件的所有文件名。你可能想-exec rm {} ';'在这里使用,但因为这可能会删除一些仍在使用的文件,我认为先做一个简单的 echo 更安全。-name 'foo*.bar'或-uid 123将清理的影响限制为特定的文件模式或用户 ID,以避免意外影响。最后一点:考虑可能存在只写入一次(例如在系统启动时)但经常读取(例如任何 X-session-cookie)的文件。因此,我建议添加一些名称检查以仅影响由您的错误程序创建的文件。
edit2: 对于您的最后一个问题:文件不会从磁盘中删除,直到没有进程打开它的句柄(至少对于本机 linux 文件系统)。问题是目录条目被立即删除,这意味着从您删除文件开始,没有新进程可以再打开该文件(因为没有附加文件名)。
详情见:https : //stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
正如我所说,可能有一些文件被写入一次然后每隔一段时间读取一次(例如 X 会话 cookie、PID 文件等)。这些不会被这个小的删除脚本排除在外(这就是为什么你可能想echo在实际删除文件之前先进行测试运行的原因)。
实现安全解决方案的一种方法是使用atime.
atime存储上次访问每个文件的时间。但是该文件系统选项经常被禁用,因为它对性能有相当大的影响(根据这个博客在 20-30% 区域的某个地方)。有relatime,但是只有在mtime更改时才写入访问时间,所以这个对我们没有帮助。
如果您想使用atime,我建议您/tmp在一个单独的分区(最好是 ramdisk)上使用,这样对整个系统的性能影响就不会太大。
一旦atime启用,所有你需要做的就是更换-mtime参数与上面的命令行-atime。
您也许可以删除-not -exec fuser -s {} ';',但我会将它保留在那里以确保(以防应用程序将文件长时间保持打开状态)。
但请记住,echo在最终删除系统仍然需要的东西之前,请先测试使用的命令!
不要自己卷。
Debian/Ubuntu 有 tmpreaper,它可能在其他发行版中也可用。
# tmpreaper - cleans up files in directories based on their age
sudo apt-get install tmpreaper
cat /etc/tmpreaper.conf
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53594 次 |
| 最近记录: |