linux - 如何知道用户当前打开了哪些文件?

标签 linux perl file lsof

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

我正在尝试获取目录中的日志文件并将它们移动到另一个目录。但是,如果文件已打开,我不想对它们执行任何操作。

最佳答案

您处理问题的方式不正确。您希望在阅读时防止文件在您的下面被修改,并且如果没有操作系统支持就无法做到这一点。在多用户系统中,您所能期望的最好的结果就是保持存档元数据的一致性。

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

你想实现什么目标?

添加以回复评论:

查看 logrotate 来窃取有关如何一致处理此问题的想法,只需让它为您完成工作即可。如果您担心文件重命名会使当前正在写入文件的进程破坏某些内容,请查看 man 2 rename:

rename() renames a file, moving it between directories if required. Any other hard links to the file (as created using link(2)) are unaffected. Open file descriptors for oldpath are also unaffected.

If newpath already exists it will be atomically replaced (subject to a few conditions; see ERRORS below), so that there is no point at which another process attempting to access newpath will find it missing.

关于linux - 如何知道用户当前打开了哪些文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190200/

相关文章:

perl - 谷歌 oAuth2 未授权_客户端通过 refresh_token

perl - 使用 Perl 模块 IO::Uncompress::AnyUncompress

MYSQL TINYBLOB 与 LONGBLOB

regex - 如何将VI中的搜索选择复制到剪贴板并粘贴到同一文件中?

linux - 从字符串 linux 中获取键值

javascript - Node.js 使用哪种线程模型?

linux - merge - 以特定顺序追加二进制文件的内容

c - 文件指针在传递给函数时表现不同。为什么?

C# 如何将 File.ReadLines 转换为字符串数组?

linux - 如果 256 个线程比 8 个线程提供更好的性能,我可能采用了错误的方法吗?