2011-05-31 96 views
2

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

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

+0

即使您检测到本地打开,您也无法找到谁通过nfs打开了文件。 – mark4o 2011-05-31 16:26:36

+1

*为什么*不是lsof? (对此的回答也可能排除其他解决方案...) – ysth 2011-05-31 16:48:04

回答

1

尝试ls -l /proc/*/fd/*作为根。

+1

这只会告诉你当你运行命令时打开的是什么,而不是现在打开的或者自从打开和关闭的。 – msw 2011-05-31 15:59:03

+1

否,当进程打开并关闭文件描述符时,'/ proc/*/fd'不会更新。 – mob 2011-05-31 16:10:39

+2

,并且在读取'/ proc'和打开文件之间的延迟时,任何事情都可能发生。 – msw 2011-05-31 16:18:09

3

您正在错误地接近问题。您希望在阅读时防止文件在您的下面被修改,并且在没有操作系统支持的情况下无法执行此操作。您可以在多用户系统中获得最好的效果,即保持归档元数据的一致性。

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

你想完成什么?

新增回应评论:

logrotate窃取有关如何处理这种一致只是在用它做的工作给你的想法。如果您担心的文件重命名将使得当前写他们将打破东西的过程,看看man 2 rename

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

如果NEWPATH已经存在,它将被替换原子(受 几个条件;看到错误 下文),以便有在 不点,这另一个进程试图 访问NEWPATH会发现它不见了。

+0

我基本上是试图把一个目录中的日志文件,并将它们移动到另一个目录。如果文件是开放的,我不想对他们做任何事情。 – Anthony 2011-05-31 16:08:49

+0

@Anthony:为什么?你可以解释吗?最好的答案是程序上知道哪些文件正在写入... – ysth 2011-05-31 16:50:53

1

msw已经正确回答了这个问题,但是如果你想提交打开的进程列表,lsof命令会给你。

相关问题