我正在编写一个小工具,我需要在其中查找每个用户的文件系统内存使用情况。
如果文件系统使用超过某个阈值,我必须做一些清理活动。我可以使用什么系统调用,以便能够找到每个用户的内存使用情况?
答案 0 :(得分:15)
一种简单的方法是
du -shc /home/*
要对其进行排序:
du -smc /home/* | sort -n
还有一个众所周知的Perl脚本,可以选择为每个用户发送磁盘使用情况报告:durep
答案 1 :(得分:1)
也许您对磁盘配额感兴趣(某些文件系统支持,但并非所有文件系统支持)。低级系统调用是quotactl(2)。也许使用现有工具quota(1)和quotacheck
,edquota
,warnquota
,quotaon
等等也可能就足够了。
如果您想知道给定进程使用的内存,请考虑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/$$/status
和cat /proc/$$/maps
来查询当前shell进程的信息。
当然,还要考虑proc(5)和du(1)命令(如果你想得到他们的输出,可能会小心地调用它们 直到df(1))。如果由于某种原因您想要递归扫描文件树(例如计算其累积的使用大小,如du
那样),请考虑使用popen(3)函数。另请参阅nftw(3)和stat(2)系统调用。
请记住,当您的程序正在探索或查询文件系统时,其他进程可以(并且经常会)写入文件系统。您的用户可以启动新流程(可能是间接的,例如statfs(2),crontab(5),system(3)和fork(2),at
,batch
,{ {1}} ...)随时都可以。
还阅读一本好的Linux编程书,可能是旧的execve(2)和Advanced Linux Programming