如何判断任何用户当前打开的文件?

时间:2011-05-31 15:51:04

标签: linux perl file lsof

我正在尝试编写脚本或一段代码来存档文件,但我不想存档任何当前打开的文件。我需要找到一种方法来确定目录中的哪些文件是打开的。我想使用Perl或shell脚本,但如果需要可以尝试使用其他语言。它将在Linux环境中,我没有选择使用lsof。我的定影器也有不一致的结果。谢谢你的帮助。

我正在尝试将日志文件放在目录中并将它们移动到另一个目录。如果文件是打开的,我不想对它们做任何事情。

3 个答案:

答案 0 :(得分:3)

您正在接近问题。您希望在阅读时保持文件不被修改,如果没有操作系统支持,则无法执行此操作。您希望在多用户系统中获得的最佳效果是保持存档元数据的一致性。

例如,如果要创建存档目录,请确保存档中存储的字节数与目录匹配。您可以在读取文件系统之前和之后校验文件内容,并将其与您写入存档的内容进行比较,并将其标记为“不一致”。

你想要完成什么?

在回复评论时添加:

看看logrotate窃取有关如何始终如一地处理此问题的想法,只需让它为您完成工作。如果您担心重命名文件会使当前正在编写文件的进程破坏,请查看man 2 rename

  

rename()重命名文件,移动它   目录之间如果需要。任何   该文件的其他硬链接(如   使用link(2)创建的不受影响。   打开旧路径的文件描述符   也没有受到影响。

     

如果newpath已经存在,它将被原子替换(主题   在一些条件下;看错误   下面),所以没有意义   另一个过程试图   访问newpath会发现它丢失。

答案 1 :(得分:1)

以root身份尝试ls -l /proc/*/fd/*

答案 2 :(得分:1)

msw已正确回答了问题,但如果要提交打开进程列表,lsof命令会将其提供给您。