Назад | Перейти на главную страницу

поиск каталогов, которые потребляют большую часть квоты объема AFS

Квота объема AFS для одного из наших пользователей компьютеров почти превышена. Бег fs listquota или fs lq дает ему предупреждение:

olifri@ubuntu:~$ fs listquota ~
Volume Name                    Quota       Used %Used   Partition
H.olifri                      500000     492787   99%<<       38% <<WARNING

Я хотел бы поделиться с ним сценарием оболочки, который определит, какие из его каталогов потребляют большую часть его квоты тома AFS. Тогда у него будет лучшее представление о том, с чего начать удаление файлов.

Обратите внимание, что в файловой системе AFS пользователь может монтировать другие тома AFS внутри тома AFS. Это означает, что рекурсия с / usr / bin / найти может войти в другие тома AFS, которые нас не интересуют.

Наше клиентское программное обеспечение AFS - Openafs 1.6.1 и работает на компьютерах с Ubuntu 12.04. У нас нет прав администратора на файловых серверах AFS, так как они находятся в ведении другого отдела.

Команда / usr / bin / du кажется, не знает концепции томов AFS. Лучшая идея, которая у меня есть сейчас, - написать сценарий, который для каждого подкаталога будет проверять, является ли каталог точкой монтирования для тома AFS. Например, команда fs lsmount может быть использован для этого. Для нормального каталога fs lsmount дает этот результат

esjolund@ubuntu:~$ mkdir ~/testdir
esjolund@ubuntu:~$ fs lsmount ~/testdir
'/afs/pdc.kth.se/home/e/esjolund/testdir' is not a mount point.

и для точки монтирования AFS fs lsmount дает этот результат

esjolund@ubuntu:~$ fs mkmount -dir ~/testmount -vol prj.sbc.esjolund00
esjolund@ubuntu:~$ fs lsmount ~/testmount
'/afs/pdc.kth.se/home/e/esjolund/testmount' is a mount point for volume '#prj.sbc.esjolund00'

Прежде чем приступить к написанию сценария оболочки, я хотел бы услышать, есть ли у вас лучшие идеи, как решить проблему?

#!/usr/bin/python                                                                                                                  
import os
import sys
import subprocess

if len(sys.argv) != 2:
  print >> sys.stderr, "error: Wrong number of arguments. One argument expected (the directory name)"
  sys.exit(1)

for dirpath, dirnames, filenames in os.walk(sys.argv[1]):
  for dirname in dirnames:
    subdirpath = os.path.join(dirpath, dirname)
    p = subprocess.Popen(["fs", "lsmount", subdirpath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # It seems we can distinguish an AFS volume mount point from a normal directory by just                                        
    # looking at the return code.                                                                                                  
    # Maybe we should also look at the stdout and stderr?                                                                          
    # (In other words the variables out and err)                                                                                   
    out, err = p.communicate()
    if ( p.returncode == 0 ):
      dirnames.remove(dirname)
  total_size = 0
  for filename in filenames:
    filepath = os.path.join(dirpath, filename)
    statinfo = os.lstat(filepath)
    total_size += statinfo.st_size
  print "%i %s" % (total_size, dirpath)

Используйте такую ​​команду

olifri@ubuntu:~$ python /tmp/script.py  ~ | sort -n