你可能想尝试这样的事情:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find用于查找符合特定条件的文件。
-mtime +7
仅选择超过7天的文件(您可以使用任何其他值)
-exec fuser -s {} ';'
对于与旧标准匹配的每个文件,以静默方式调用fuser。对于未访问的每个文件,fuser返回0(= true),对于未访问的文件,fuser返回1(= false)。因为我们只对未被接受的人感兴趣,所以我们放了一个 -not
在这之前 -exec
-exec echo {} ';'
只打印符合条件的所有文件名。你可能想要使用 -exec rm {} ';'
而在这里,但由于这可能会删除一些仍在使用的文件,我认为首先做一个简单的回声更安全。
- 编辑: 你可能想要添加类似的东西
-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
EDIT3: 但是,如果我想自动完成整个过程呢?
正如我所说,可能存在一次写入然后每隔一段时间读取一次的文件(例如X会话cookie,PID文件等)。这些小删除脚本不会排除这些(这就是为什么你可能想要进行测试运行的原因 echo
首先在实际删除文件之前)。
实现安全解决方案的一种方法是使用 atime
。
atime
存储上次访问每个文件的时间。但是该文件系统选项通常被禁用,因为它对性能有很大的影响(根据 这个博客 在20-30%地区的某个地方)。有 relatime
,但是那个只写了访问时间 mtime
已经改变了,所以这个不会帮助我们。
如果你想使用 atime
,我建议有 /tmp
在一个单独的分区(理想情况下是一个ramdisk),以便对整个系统的性能影响不是太大。
一旦 atime
已启用,您所要做的就是更换 -mtime
上面命令行中的参数 -atime
。
你也许可以删除 -not -exec fuser -s {} ';'
,但我保留它只是为了确保(如果应用程序保持文件打开很长一段时间)。
但请记住使用测试命令 echo
在你最终删除你的系统仍然需要的东西之前!