如何查找每用户磁盘空间使用情况?

时间:2012-02-13 11:44:51

标签: c linux unix

我正在编写一个小工具,我需要在其中查找每个用户的文件系统内存使用情况。

如果文件系统使用超过某个阈值,我必须做一些清理活动。我可以使用什么系统调用,以便能够找到每个用户的内存使用情况?

2 个答案:

答案 0 :(得分:15)

一种简单的方法是

du -shc /home/*

要对其进行排序:

du -smc /home/* | sort -n

还有一个众所周知的Perl脚本,可以选择为每个用户发送磁盘使用情况报告:durep

答案 1 :(得分:1)

也许您对磁盘配额感兴趣(某些文件系统支持,但并非所有文件系统支持)。低级系统调用是quotactl(2)。也许使用现有工具quota(1)quotacheckedquotawarnquotaquotaon等等也可能就足够了。

如果您想知道给定进程使用的内存,请考虑getrusage(2)系统调用。您还可以在/proc/self//proc/1234下阅读pid 1234的伪文件。您还可以扫描 /proc/(使用通常的目录扫描例程:{{3使用opendir(3)循环readdir(3),使用closedir ...结束...)数字目录(因为/proc/1234/描述了pid 1234的过程)。详细了解stat(2)(例如/proc/self/maps/proc/1234/smaps/proc/1234/status等。 Tou可以通过读取/proc/1234/status/proc/1234/maps伪文件来查询进程1234的虚拟地址空间。尝试在终端中使用cat /proc/$$/statuscat /proc/$$/maps来查询当前shell进程的信息。

当然,还要考虑proc(5)du(1)命令(如果你想得到他们的输出,可能会小心地调用它们 直到df(1))。如果由于某种原因您想要递归扫描文件树(例如计算其累积的使用大小,如du那样),请考虑使用popen(3)函数。另请参阅nftw(3)stat(2)系统调用。

请记住,当您的程序正在探索或查询文件系统时,其他进程可以(并且经常会)写入文件系统。您的用户可以启动新流程(可能是间接的,例如statfs(2)crontab(5)system(3)fork(2)atbatch,{ {1}} ...)随时都可以。

还阅读一本好的Linux编程书,可能是旧的execve(2)Advanced Linux Programming