2017-02-22 78 views
0

我想在日誌大小超過配額時刪除一些日誌,但我需要檢查日誌是否在刪除之前打開。[Golang] [Linux] - 如何獲取當前用戶打開的所有文件

如何獲取當前用戶打開的所有文件?

+1

[lsof的(https://www.freebsd.org/cgi/man.cgi?query=lsof&sektion=8&manpath=freebsd-release -ports) – bansi

+2

通過解析「/ proc」,我可以得到所有打開的文件。我想知道是否有更好的方法 –

+0

只是檢查我的第一個評論,這裏是[一些例子](http://www.thegeekstuff.com/2012/08/lsof-command-examples)和順便說一句,你可以使用[logrotate](https://www.freebsd.org/cgi/man.cgi?query=logrotate&apropos=0&sektion=8&manpath=FreeBSD+11.0-RELEASE+and+Ports&arch=default&format=html)自動壓縮和存檔日誌,然後刪除它(可能與一個腳本) – bansi

回答

1

解析/ proc(請參閱proc(5) ...)可能是最有效的方法,並且是lsof會執行的操作。

您可以先掃描所有(數字)目錄以查找您的用戶正在運行的進程,而不是所有此類目錄中使用/proc/ pid /fd目錄。

順便說一句,你可能不在乎,只是刪除這些日誌文件。如果內核打開,內核的行爲將會適當。

但也許你應該問你的系統管理員設置disk quotas。見quota(1) & quotaon(8)

也許使用&配置logrotate應該就夠了。

0

如果你是bash腳本,lsof可能適合你的需要。如果您對使用用戶名X的用戶感興趣,則lsof -uX應該執行此操作。

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 
} 
相關問題