我正试图编写一个脚本或一段代码来归档文件,但我不想归档当前打开的任何内容。我需要找到一种方法来确定目录中的哪些文件是打开的。我想使用Perl或shell脚本,但如果需要,可以尝试使用其他语言。它将在Linux环境中,我没有使用lsof的选项。我也有不一致的结果与融合器。谢谢你的帮助。
我正在尝试将一个目录中的日志文件移到另一个目录。但是,如果这些文件是打开的,我不想对它们做任何事情。
您处理问题不正确。您希望在阅读时防止文件在您下面被修改,如果没有操作系统的支持,就无法做到这一点。在多用户系统中,您所能期望的最好结果就是保持归档元数据的一致性。
例如,如果要创建存档目录,请确保存档中存储的字节数与该目录匹配。您可以在读取文件系统之前和之后对文件内容进行校验和,并将其与写入存档的内容进行比较,也许可以将其标记为"不一致"。
你想完成什么?
添加以回应评论:
看看logrotate
,窃取关于如何始终如一地处理这件事的想法,让它为你做这件事。如果您担心重命名文件会使当前正在写入文件的进程中断,请查看man 2 rename
:
rename()重命名文件,移动它如果需要,在目录之间。任何文件的其他硬链接(如使用链接(2)创建)不受影响。旧路径的打开文件描述符为同样未受影响。
如果newpath已经存在,它将被原子替换(主题在一些条件下;请参阅ERRORS以下),因此在另一个进程试图访问newpath会发现它不见了。
尝试将ls -l /proc/*/fd/*
作为根目录。
msw正确回答了这个问题,但如果您想归档打开的进程列表,lsof命令会将其提供给您。