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

huangapple go评论84阅读模式
英文:

[Golang][Linux] - How to get all open files by current user

问题

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

你可以使用以下方法来获取当前用户打开的所有文件:

  1. 使用命令lsof(list open files)来列出当前系统中所有打开的文件。在终端中输入以下命令:

    lsof -u <username>
    

    <username>替换为当前用户的用户名。执行该命令后,将显示当前用户打开的所有文件的列表。

  2. 使用fuser命令来查找当前用户打开的文件。在终端中输入以下命令:

    fuser -u <username>
    

    <username>替换为当前用户的用户名。执行该命令后,将显示当前用户打开的所有文件的进程ID。

请注意,这些命令需要在具有足够权限的用户下运行,以便访问所有打开的文件信息。

英文:

I want to delete some logs when logs size exceed quota, But I need to check if the log is opening before delete it.

How to get all open files by current user?

答案1

得分: 1

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

您可以首先扫描所有(数字)目录,以查找由您的用户运行的进程,然后在所有这些目录中使用/proc/pid/fd目录。

顺便说一句,您可能不关心,只需删除这些日志文件。如果它已经打开,内核将适当地处理。

但也许您应该请您的系统管理员设置磁盘配额。请参阅quota(1)quotaon(8)

也许使用和配置logrotate就足够了。

英文:

Parsing /proc (see proc(5)...) is probably the most efficient way and is what lsof would do.

You could first scan all (numeric) directories to find processes running by your users, than in all such directories use the /proc/pid/fd directory.

BTW, you might not care and just remove these log files. The kernel will behave appropriately if it was opened.

But perhaps you should ask your sysadmin to setup disk quotas. See quota(1) & quotaon(8).

Perhaps using & configuring logrotate should be enough.

答案2

得分: 0

如果你在进行Bash脚本编程,lsof可能适合你的需求。如果你对用户名为X的用户感兴趣,lsof -uX应该能满足你的要求。

英文:

If you're bash scripting, lsof might fit your need. If you're interested in the user with username X, lsof -uX should do the trick.

答案3

得分: -1

通过解析"/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
}
英文:

by parse "/proc" get all open file:

func getOpenfiles() (openfiles map[string]bool) {
	files, _ := ioutil.ReadDir(&quot;/proc&quot;)
	openfiles = make(map[string]bool)
	for _, f := range files {
		m, _ := filepath.Match(&quot;[0-9]*&quot;, f.Name())
		if f.IsDir() &amp;&amp; m {
			fdpath := filepath.Join(&quot;/proc&quot;, f.Name(), &quot;fd&quot;)
			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
}

huangapple
  • 本文由 发表于 2017年2月22日 10:57:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/42381875.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定