2017-02-22 26 views
0

Я хочу удалить несколько журналов, когда размер журналов превышает квоту. Но мне нужно проверить, открывается ли журнал перед удалением.[Golang] [Linux] - Как получить все открытые файлы от текущего пользователя

Как получить все открытые файлы от текущего пользователя?

+1

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

+2

by parse "/ 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.

Вы можете сначала сканировать все (числовые) каталоги, чтобы находить процессы, выполняемые вашими пользователями, чем во всех таких каталогах, используйте каталог pid /fd.

Кстати, вам может не понравиться и просто удалить эти файлы журналов. Ядро будет вести себя соответствующим образом, если оно будет открыто.

Но, возможно, вам следует попросить вашего администратора установить disk quotas. См. quota(1) & quotaon(8).

Возможно, с использованием & конфигурации logrotate должно быть достаточно.

0

Если вы используете скрипты bash, lsof может поместиться в соответствии с вашими потребностями. Если вас интересует пользователь с именем пользователя X, lsof -uX должен сделать трюк.

0

путем синтаксического анализа "/ прок" получить все открытые файлы:

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^