2017-02-22 2 views
0

Ich möchte einige Protokolle löschen, wenn Protokolle Größe überschreiten Kontingent, aber ich muss überprüfen, ob das Protokoll geöffnet ist, bevor es löschen.[Golang] [Linux] - Wie bekomme ich alle geöffneten Dateien von aktuellen Benutzer

Wie bekomme ich alle geöffneten Dateien vom aktuellen Benutzer?

+1

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

+2

von parse "/ proc", ich kann alle Eröffnungsdatei bekommen. Ich möchte wissen, ob es einen besseren Weg gibt –

+0

überprüfen Sie einfach meinen ersten Kommentar und hier ist [einige Beispiele] (http://www.thegeekstuff.com/2012/08/lsof-command-examples) und BTW, können Sie verwenden [logrotate] (https://www.freebsd.org/cgi/man.cgi?query=logrotate&apropos=0§ion=8&manpath=FreeBSD+11.0-RELEASE+and+Ports&arch=default&format=html) um die Logs automatisch zu komprimieren und zu archivieren, dann lösche es später (kann mit einem Skript sein) – bansi

Antwort

1

Parsing/Proc (siehe proc(5) ...) ist wahrscheinlich der effizienteste Weg und ist, was lsof tun würde.

Sie könnten zuerst alle (numerischen) Verzeichnisse durchsuchen, um von Ihren Benutzern ausgeführte Prozesse zu finden, als in allen solchen Verzeichnissen das Verzeichnis /proc/ pid /fd.

BTW, könnten Sie nicht kümmern und nur diese Protokolldateien entfernen. Der Kernel verhält sich entsprechend, wenn er geöffnet wurde.

Aber vielleicht sollten Sie Ihren Systemadministrator bitten, disk quotas einzurichten. Siehe quota(1) & quotaon(8).

Vielleicht mit & konfigurieren logrotate sollte genug sein.

0

Wenn Sie Bash-Skripterstellung sind, könnte lsof Ihre Anforderungen erfüllen. Wenn Sie an dem Benutzer mit Benutzername X interessiert sind, sollte lsof -uX den Trick tun.

0

von Parse "/ proc" alle geöffnete Datei erhalten:

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 
} 
Verwandte Themen