我正在尝试编写脚本或一段代码来存档文件,但我不想存档任何当前打开的文件。我需要找到一种方法来确定目录中的哪些文件是打开的。我想使用Perl或shell脚本,但如果需要可以尝试使用其他语言。它将在Linux环境中,我没有选择使用lsof。我的定影器也有不一致的结果。谢谢你的帮助。
我正在尝试将日志文件放在目录中并将它们移动到另一个目录。如果文件是打开的,我不想对它们做任何事情。
答案 0 :(得分:3)
您正在接近问题。您希望在阅读时保持文件不被修改,如果没有操作系统支持,则无法执行此操作。您希望在多用户系统中获得的最佳效果是保持存档元数据的一致性。
例如,如果要创建存档目录,请确保存档中存储的字节数与目录匹配。您可以在读取文件系统之前和之后校验文件内容,并将其与您写入存档的内容进行比较,并将其标记为“不一致”。
你想要完成什么?
在回复评论时添加:
看看logrotate
窃取有关如何始终如一地处理此问题的想法,只需让它为您完成工作。如果您担心重命名文件会使当前正在编写文件的进程破坏,请查看man 2 rename
:
rename()重命名文件,移动它 目录之间如果需要。任何 该文件的其他硬链接(如 使用link(2)创建的不受影响。 打开旧路径的文件描述符 也没有受到影响。
如果newpath已经存在,它将被原子替换(主题 在一些条件下;看错误 下面),所以没有意义 另一个过程试图 访问newpath会发现它丢失。
答案 1 :(得分:1)
以root身份尝试ls -l /proc/*/fd/*
。
答案 2 :(得分:1)
msw已正确回答了问题,但如果要提交打开进程列表,lsof命令会将其提供给您。