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