英文:
[Golang][Linux] - How to get all open files by current user
问题
如何获取当前用户打开的所有文件?
你可以使用以下方法来获取当前用户打开的所有文件:
-
使用命令
lsof
(list open files)来列出当前系统中所有打开的文件。在终端中输入以下命令:lsof -u <username>
将
<username>
替换为当前用户的用户名。执行该命令后,将显示当前用户打开的所有文件的列表。 -
使用
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("/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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论