Квота объема 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