V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JKeita
V2EX  ›  问与答

golang 读取文件,怎么让它能不占用并且能够随时移动删除文件

  •  
  •   JKeita · 2019-08-29 16:10:17 +08:00 · 2175 次点击
    这是一个创建于 1913 天前的主题,其中的信息可能已经有所发展或是发生改变。

    filebeat 读取日志时支持随时移动删除文件,但是用 golang os.Open 方法读取文件时想要删除或移动文件的时候会提示文件被占用。 请问 filebeat 是使用了什么机制原理实现了?

    13 条回复    2019-08-30 09:03:00 +08:00
    codehz
        1
    codehz  
       2019-08-29 16:57:00 +08:00 via Android
    读取完关闭了就好
    JKeita
        2
    JKeita  
    OP
       2019-08-29 17:03:41 +08:00
    @codehz 就是要像 filebeat 一样实时监听文件啊。怎么可能关闭
    Trim21
        3
    Trim21  
       2019-08-29 17:05:51 +08:00
    filebeat 在 github 上有源码...
    JKeita
        4
    JKeita  
    OP
       2019-08-29 17:13:45 +08:00
    @Trim21 看不懂啊,调用层次太多了。
    Vegetable
        5
    Vegetable  
       2019-08-29 17:42:11 +08:00
    会吗 ?我记得不会吧,是 windows 吗?
    JKeita
        6
    JKeita  
    OP
       2019-08-29 17:44:59 +08:00
    @Vegetable centos
    flynaj
        7
    flynaj  
       2019-08-29 17:48:11 +08:00 via Android
    open 的时候设置权限
    Vegetable
        8
    Vegetable  
       2019-08-29 17:49:01 +08:00   ❤️ 1
    CEBBCAT
        9
    CEBBCAT  
       2019-08-29 17:49:22 +08:00 via Android
    软链接行吗?瞎想的
    Vegetable
        10
    Vegetable  
       2019-08-29 17:53:58 +08:00
    @JKeita ..我 linux 测试没有你说的问题
    linux 的就这么一段

    // ReadOpen opens a file for reading only
    func ReadOpen(path string) (*os.File, error) {
    flag := os.O_RDONLY
    perm := os.FileMode(0)
    return os.OpenFile(path, flag, perm)
    },和 os.Open 一样的。


    // Open opens the named file for reading. If successful, methods on
    // the returned file can be used for reading; the associated file
    // descriptor has mode O_RDONLY.
    // If there is an error, it will be of type *PathError.
    func Open(name string) (*File, error) {
    return OpenFile(name, O_RDONLY, 0)
    }
    Vegetable
        11
    Vegetable  
       2019-08-29 18:02:21 +08:00
    我印象比较深,linux 中有程序占用文件的时候删除文件,是没有真正删除的,进程还是可以写到文件里,只有进程释放文件之后才会真正被删除。因为之前清理服务器上的垃圾日志时删了文件空间没有释放,所以专门去查了一下。

    也就是说理论上 linux 不需要专门处理,读就完了,但是你要监控这个文件是不是被删了,filebeat 有一个 IsRemoved 的方法,可能就是检测这个文件是不是删掉了,删掉了就释放资源的功能。
    JKeita
        12
    JKeita  
    OP
       2019-08-30 08:57:56 +08:00
    @Vegetable 搞不懂,我这边都试了,只要没有 close,都会提示文件被占用无法移动。
    JKeita
        13
    JKeita  
    OP
       2019-08-30 09:03:00 +08:00
    @Vegetable 好吧我知道问题了,原来是读的文件是共享目录里,也就是 windows 下的文件造成的,读取虚拟机 centos7 下的文件没这问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2667 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.