[Golang] [Linux] - 如何获取当前用户的所有打开文件

时间:2017-02-22 02:57:34

标签: linux go

我希望在日志大小超过配额时删除一些日志,但我需要在删除之前检查日志是否打开。

如何让当前用户获取所有打开的文件?

3 个答案:

答案 0 :(得分:1)

解析/ proc(参见proc(5) ...)可能是最有效的方式,也是lsof会做的。

您可以先扫描所有(数字)目录以查找用户运行的进程,而不是所有此类目录都使用/proc/ pid /fd目录。

顺便说一句,你可能不在乎,只是删除这些日志文件。如果内核被打开,内核将表现得恰到好处。

但也许你应该让你的系统管理员设置disk quotas。见quota(1)& quotaon(8)

也许正在使用&配置logrotate就足够了。

答案 1 :(得分:0)

如果你是bash脚本,lsof可能符合你的需要。如果您对使用用户名X的用户感兴趣,lsof -uX应该可以解决问题。

答案 2 :(得分:0)

通过解析“/ proc”获取所有打开的文件:

func getOpenfiles() (openfiles map[string]bool) {
    files, _ := ioutil.ReadDir("/proc")
    openfiles = make(map[string]bool)
    for _, f := range files {
        m, _ := filepath.Match("[0-9]*", f.Name())
        if f.IsDir() && m {
            fdpath := filepath.Join("/proc", f.Name(), "fd")
            ffiles, _ := ioutil.ReadDir(fdpath)
            for _, f := range ffiles {
                fpath, err := os.Readlink(filepath.Join(fdpath, f.Name()))
                if err != nil {
                    continue
                }
                openfiles[fpath] = true
            }
        }
    }
    return openfiles
}