Поиск каталогов, которые потребляют много квоты объема 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/find может войти в другие тома 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'

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

1 ответ

#!/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
Другие вопросы по тегам