AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 774829
Accepted
Stewart
Stewart
Asked: 2024-04-19 18:23:40 +0800 CST2024-04-19 18:23:40 +0800 CST 2024-04-19 18:23:40 +0800 CST

如何使用 inotify 可靠地维护对已编辑文件的监视?

  • 772

我想使用 来监视文件inotify,并在有人更改内容(IN_MODIFY或)时触发一些代码,但是当用户使用他们喜欢的工具编辑文件时,IN_CLOSE_WRITE我遇到了停止返回事件的问题。inotify该文件应该很简单(单行、无空格、最多 20 个字符)。我不想限制它们的使用,但我不确定如何处理不同的情况。

我正在使用inotify这些是当各种应用程序编辑文件时我收到的事件:

行动 inotify 事件
touch file IN_OPEN
echo "data" > file IN_MODIFY,IN_OPEN,IN_ACCESS, 然后IN_CLOSE_NOWRITE
nano file(打开时) IN_OPEN
nano file(在^O) IN_MODIFY, IN_CLOSE_WRITE, IN_OPEN,IN_ACCESS
vim file(打开时) IN_OPEN,IN_CLOSE_NOWRITE
vim file(在:w) IN_MOVE_SELF, IN_ATTRIB, 然后事件停止来自该文件
gedit file(打开时) IN_OPEN, IN_CLOSE_NOWRITE,IN_ACCESS
gedit file(保存时) IN_OPEN, IN_CLOSE_WRITE, IN_ATTRIB,然后事件停止来自该文件
mv newfile file IN_ATTRIB,然后事件停止来自该文件

有一次,我以为我看到了gedit触发器,IN_DELETE_SELF然后又沉默了。

vim在用户使用and的情况下gedit,我会inotify在用户完成编辑后停止获取事件。我该如何处理这个问题?

我所看到的唯一共同点是事件IN_ATTRIB。我怀疑当我收到事件时IN_ATTRIB,我应该inotify_rm_watch()这样做,然后基于相同的路径wd重新创建一个新的。inotify_add_watch()但这是正确的方法吗?

另一种选择可能是监视父目录。受影响的文件名包含在 中inotify_event::name,因此我可以过滤感兴趣的文件,并触发任何IN_MODIFY与我感兴趣的文件匹配的IN_CLOSE_WRITE位置。name

inotify
  • 2 2 个回答
  • 47 Views

2 个回答

  • Voted
  1. Best Answer
    Stewart
    2024-04-19T22:35:54+08:002024-04-19T22:35:54+08:00

    正如 ikkachu 提到的,一些编辑器创建一个新文件,然后替换原始文件,更改 inode。这意味着原始监视描述符上的任何监视都将过期。

    答案是查看父目录,并检查具有目标名称的任何文件的更改。像这样的东西:

    namespace fs = std::filesystem;
    fs::path path = "./file1";
    assert( !path.is_directory() );
    
    int fd = inotify_init();
    
    int wd = inotify_add_watch(
        fd, 
        path.parent_path().c_str(),
        IN_MODIFY | IN_CREATE | IN_CLOSE_WRITE
    );  
    
    ...
    
    inotify_event event;
    read(fd, &event, BUF_SIZE);
    
    if (wd == event->wd && path.filename() == event->name) {
        emit_file_changed();
    }
    

    这些事件 ( IN_MODIFY|IN_CREATE|IN_CLOSE_WRITE) 捕获了我在上面尝试过的技术 ( touch, echo "" >, vim, nano, gedit)。我打赌我也可以捕获这些改变的符号链接。

    • 1
  2. Artem S. Tashkinov
    2024-04-20T19:51:24+08:002024-04-20T19:51:24+08:00

    或者您可以使用 fatrace,它速度快得多并且没有此类问题,例如:

    fatrace --timestamp --filter='WD<>+'
    
    • 0

相关问题

  • 数据分区和 IntelliJ IDEA 外部文件同步速度

  • 警告或执行脚本,仅当配置文件显示不在生产模式时

  • 如果创建、删除或修改目录中的文件,我将如何使用 inotifywait 执行命令?

  • 无法监控 Dropbox 文件夹

  • inotifywait 排除文件类型

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve