2

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

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

4

3 回答 3

3

您正在错误地解决问题。您希望在阅读时防止文件在您的下方被修改,并且在没有操作系统支持的情况下无法做到这一点。在多用户系统中,您可以期望的最好的结果是保持存档元数据的一致性。

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

你想达到什么目的?

添加以回应评论:

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

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

如果 newpath 已经存在,它将被原子地替换(受一些条件的影响;请参阅下面的错误),以便尝试访问 newpath 的另一个进程不会发现它丢失。

于 2011-05-31T15:57:57.743 回答
1

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

于 2011-05-31T15:56:26.920 回答
1

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

于 2011-05-31T16:40:39.580 回答