我想写一个脚本或一段代码来存档文件,但我不想存档任何当前打开的文件。我需要找到一种方法来确定打开目录中的文件。我想要使用Perl或shell脚本,但可以尝试在需要时使用其他语言。它将在Linux环境中,我没有选择使用lsof。我也有热熔器的不一致的结果。谢谢你的帮助。如何判断当前用户打开哪些文件?
我正在尝试将目录中的日志文件移动到另一个目录。如果文件是开放的,我不想对他们做任何事情。
我想写一个脚本或一段代码来存档文件,但我不想存档任何当前打开的文件。我需要找到一种方法来确定打开目录中的文件。我想要使用Perl或shell脚本,但可以尝试在需要时使用其他语言。它将在Linux环境中,我没有选择使用lsof。我也有热熔器的不一致的结果。谢谢你的帮助。如何判断当前用户打开哪些文件?
我正在尝试将目录中的日志文件移动到另一个目录。如果文件是开放的,我不想对他们做任何事情。
您正在错误地接近问题。您希望在阅读时防止文件在您的下面被修改,并且在没有操作系统支持的情况下无法执行此操作。您可以在多用户系统中获得最好的效果,即保持归档元数据的一致性。
例如,如果要创建存档目录,请确保存档在存档中的字节数与目录匹配。您可以在读取文件系统之前和之后校验文件内容,并将其与您写入档案的内容进行比较,并可能将其标记为“不一致”。
你想完成什么?
新增回应评论:
看logrotate
窃取有关如何处理这种一致只是在用它做的工作给你的想法。如果您担心的文件重命名将使得当前写他们将打破东西的过程,看看man 2 rename
:
重命名()重命名文件,如果需要的话目录之间移动它 。任何 其他到文件的硬链接(如使用链接(2)创建的 )不受影响。 旧路径的打开文件描述符 也不受影响。
如果NEWPATH已经存在,它将被替换原子(受 几个条件;看到错误 下文),以便有在 不点,这另一个进程试图 访问NEWPATH会发现它不见了。
msw已经正确回答了这个问题,但是如果你想提交打开的进程列表,lsof命令会给你。
即使您检测到本地打开,您也无法找到谁通过nfs打开了文件。 – mark4o 2011-05-31 16:26:36
*为什么*不是lsof? (对此的回答也可能排除其他解决方案...) – ysth 2011-05-31 16:48:04