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

Who*_*ami 8 c unix linux

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

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

seh*_*ehe 16

一种简单的方法

du -shc /home/*
Run Code Online (Sandbox Code Playgroud)

要对它进行排序:

du -smc /home/* | sort -n
Run Code Online (Sandbox Code Playgroud)

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


Bas*_*tch -1

也许您对磁盘配额感兴趣(某些但不是全部文件系统支持磁盘配额)。低级系统调用是quotactl(2)。也许使用现有的工具quota(1)quotacheck,,,edquota等等 ...可能就足够了。warnquotaquotaon

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

当然,还要考虑du(1)df(1)命令(如果您想获得它们的输出,可以通过popen(3)仔细调用它们)。如果出于某种原因您想要递归扫描文件树(例如,像这样计算其累积使用的大小),请考虑使用nftw(3)函数。另请参见stat(2)statfs(2)系统调用。du

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

还可以阅读一本好的 Linux 编程书籍,也许是旧的《高级 Linux 编程》syscalls(2)

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

如果您在 Linux 上使用 C 进行编码,请考虑巧妙地组合使用nftw(3)stat(2)以及statfs(2)