【发布时间】:2020-01-22 16:59:06
【问题描述】:
我正在使用 inotify 事件监视文件的更改(碰巧,从 Python 调用 libc)。
对于git clone 期间的某些文件,我看到了一些奇怪的东西:我看到了IN_CREATE 事件,并且我通过ls 看到该文件有内容,但是,我从未看到IN_MODIFY 或IN_CLOSE_WRITE .这引起了我的问题,因为我想就文件回复IN_CLOSE_WRITE:特别是启动文件内容的上传。
行为异常的文件位于.git/objects/pack 目录中,它们以.pack 或.idx 结尾。 git 创建的其他文件具有更常规的 IN_CREATE -> IN_MODIFY -> IN_CLOSE_WRITE 链(我不关注 IN_OPEN 事件)。
这是在 MacOS 上的 docker 内部,但我在远程系统的 Linux 上的 docker 上看到了相同的证据,所以我怀疑 MacOS 方面不相关。如果观看和 git clone 在 same docker 容器中,我会看到这一点。
我的问题:
为什么这些文件中缺少这些事件?
可以做些什么呢?具体来说,我该如何响应对这些文件的写入完成?注意:理想情况下,我想在写作“完成”时做出回应,以避免不必要/(错误地)上传“未完成”的写作。
编辑:阅读https://developer.ibm.com/tutorials/l-inotify/ 看起来我所看到的与此一致
- 一个单独的临时文件,名称类似于
tmp_pack_hBV4Alz,正在创建、修改和关闭; - 一个硬链接被创建到这个文件,最终名称为
.pack; - 原
tmp_pack_hBV4Alz名称被删除。
我认为我的问题是尝试使用 inotify 作为触发器来上传文件,然后减少到注意到 .pack 文件是指向另一个文件的硬链接,并在这种情况下上传?
【问题讨论】:
-
答案可能在某处here...
-
@choroba 你可能是对的...我看到很多对 mmap 的引用,而 inotify 没有报告 mmap 对文件的访问权限
-
顺便说一句,您要解决的原始问题是什么(使用 inotify)?是否存在一些更强大的解决方案来尝试猜测 Git 进程正在做什么/已经对存储库做了什么?
-
@kostix 这是github.com/uktrade/mobius3 的一部分,将用户的主文件夹从在 AWS Fargate 中运行 JupyterLab 或 RStudio 的容器同步到 S3,在这些主文件夹中可以有 .git 文件夹。我知道 inotify 解决方案永远不会“健壮-健壮”......但我希望它可以“足够健壮”。
-
@tink 看起来接受的答案是 Linux 内核上的补丁?我怀疑一般来说它会起作用,但在我的 Fargate 案例中,我没有那种控制权。 (而且我承认我有点害怕长期依赖修补内核的后果,即使我有这种能力......)
标签: linux git docker libc inotify