V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
choice4
V2EX  ›  Java

Linux /MAC 下 vi 或 vim 的编辑再保存改变了文件的什么信息

  •  
  •   choice4 · 56 天前 · 1139 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. Java 存在一个线程周期性地向目标文件写入内容 OutputStreamWriter(FileOutputStream) , append 模式.
    2. 在过程中(不要求一定在写入中,可以为两个周期的间隔)使用 vi/vim 工具清空文件内容,如ggdG,保存退出.
    3. 此时如果在该终端使用 tail -f 持续输出该文件内容,无法得到任何结果.
    4. 文件清空后,Java 层面断点跟踪可以正常到达 FileOutputStream#writeBytes(byte[], int, int, boolean) 这个 native 方法,参数均正常,也不会抛出异常.
    5. 如果在保存退出该文件前,已经有一个终端被 tail -f 占用,那么这个终端是可以持续收到写入内容的.
    6. 以上现象我目前环境在 Linux/MacOS/Docker In Linux 稳定复现,Windows 暂未发现此问题(也可能是误测).
    7. 若使用 nano 编辑保存,或 > 重定向为空则不会影响目标文件的输出. 基于以上几点我认为可能 vi 或 vim 在保存退出后会影响文件的一些信息,而这些信息在 Linux/Macos 上用于严格区分文件的唯一性。请问有没有人了解这方便的信息? vi 或 vim 保存退出动作额外改变了文件的什么内容呢?
    7 条回复    2022-08-08 10:20:12 +08:00
    momocraft
        1
    momocraft  
       56 天前   ❤️ 1
    影响 inode
    vim 保存时会先保存到临时文件再 move

    http://vimdoc.sourceforge.net/htmldoc/options.html#'backupcopy'

    ------

    5 为什么能继续 tail 就不知道,可能我没理解
    msg7086
        2
    msg7086  
       56 天前 via Android   ❤️ 1
    @momocraft tail -f 吃的是原来的 inode 呗。
    choice4
        3
    choice4  
    OP
       56 天前
    看起来很大概率是这样的。
    dorothyREN
        4
    dorothyREN  
       56 天前
    tail -F filename
    dorothyREN
        5
    dorothyREN  
       56 天前
    @dorothyREN #4 可以用大写的 F 参数
    dorothyREN
        6
    dorothyREN  
       56 天前
    @dorothyREN #5 看错东西了。。
    rev1si0n
        7
    rev1si0n  
       55 天前
    好像是会删除重建文件,改变了 inode ,之前吃过这个亏,就是挂载单文件到 docker 上,本地改了以后 docker 里的不会变。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1048 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 159ms · UTC 18:45 · PVG 02:45 · LAX 11:45 · JFK 14:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.