Command-Line-Interface
查找消耗大量 AFS 卷配額的目錄
我們的一位電腦使用者幾乎超出了 AFS 卷配額。執行
fs listquota
或fs lq
給他一個警告:olifri@ubuntu:~$ fs listquota ~ Volume Name Quota Used %Used Partition H.olifri 500000 492787 99%<< 38% <<WARNING
我想與他分享一個 shell 腳本,該腳本將檢測他的哪些目錄消耗了他的大部分 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'
在開始編寫 shell 腳本之前,我想听聽您是否對如何解決問題有更好的想法?
#!/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