昨天,我们系统上的一位用户的脚本格式不正确,耗尽了我们文件系统之一的所有空间。通过大量的试验和错误,我能够识别用户并终止导致问题的进程。
未来有没有一种简单的方法来识别此类过程?
我认为该命令的输出lsof /file-system
将显示每个打开的文件以及用户、PID 和文件大小,我想我可以编写一个程序来解析输出,但我很好奇是否还有另一个命令可以执行此操作。我真的想要一份用户的总文件大小报告,只是为了在这个问题再次发生时帮助集中精力。
我使用的是 Solaris 10(如果相关的话)。我不是系统管理员;我可能是一名“高级用户”,为我们部门的最终用户协调事务。
答案1
lsof
只能报告进程当前打开的文件。如果数据已经写入磁盘或用于跟踪 IO,那么这对您没有帮助。
如果您查看时发生大量 IO,您可能可以使用以下命令捕获有问题的进程iotop
来自DTrace工具包
由于扫描文件系统需要时间,因此对磁盘大小进行临时报告有点困难。底层文件系统跟踪之外的任何内容都有点耗时,特别是如果您需要定期报告它。报告也无法解决问题,因此最好使用文件系统和用户配额限制可以在何处写入多少数据。设置用户配额后,您将能够使用内置报告更轻松地报告特定用户的使用情况。
作为一次性报告(无配额),您可以运行类似的操作来估计每个用户使用的空间(以 MB 为单位)。
sudo find /path -type f -ls | perl -lane ' $total{ $F[4] } += $F[6];
END { map { printf "%-8s %d\n", $_, $total{$_}/2**20; } keys %total; }'
由于空间实际上是在块中分配的,并且硬链接会错误地夸大值,因此这会略有偏差,但如果您可以等待查找完成,则足以捕获异常值:)。抱歉,有点过分了。