Как найти использование дискового пространства для каждого пользователя? - PullRequest
8 голосов
/ 13 февраля 2012

Я пишу небольшой инструмент, в котором мне требуется найти использование памяти файловой системы для каждого пользователя.

Я должен выполнить некоторые действия по очистке, если использование файловой системы пересекает определенное пороговое значение,Каков системный вызов, который я могу использовать, чтобы я мог найти использование памяти для каждого пользователя?

Ответы [ 2 ]

15 голосов
/ 13 февраля 2012

Упрощенный подход будет

du -shc /home/*

Для сортировки:

du -smc /home/* | sort -n

Существует также хорошо известный скрипт Perl, который имеет возможность рассылки отчетов об использовании диска для пользователя: durep

1 голос
/ 13 февраля 2012

Возможно, вас интересуют дисковые квоты (которые поддерживаются некоторыми, но не всеми, файловыми системами). Низкоуровневый системный вызов - quotactl (2) . Возможно, будет достаточно использовать существующие инструменты quota (1) и quotacheck, edquota, warnquota, quotaon и т. Д. ....

Если вы хотите знать память, используемую данным процессом, рассмотрите системный вызов getrusage (2) . Вы также можете читать псевдофайлы в /proc/self/ или /proc/1234 для pid 1234. Вы также можете сканирование /proc/ (используя обычные процедуры сканирования каталогов: opendir (3) с циклом readdir (3) с stat (2) , закрытием с closedir ...) для числовых каталогов (поскольку /proc/1234/ описывает процесс pid 1234). Подробнее о proc (5) (например, /proc/self/maps или /proc/1234/smaps и /proc/1234/status и т. Д.). Вы можете запросить виртуальное адресное пространство процесса 1234, прочитав псевдофайлы /proc/1234/status и /proc/1234/maps. Попробуйте, например, cat /proc/$$/status и cat /proc/$$/maps в терминале, чтобы запросить информацию для вашего текущего процесса оболочки.

Конечно, рассмотрим также команды du (1) и df (1) (возможно, их нужно вызывать осторожно через popen (3) если вы хотите получить их вывод). Если по каким-либо причинам вы хотите рекурсивно сканировать дерево файлов (например, для подсчета его накопленного использованного размера, как это делает du), рассмотрите возможность использования функций nftw (3) . См. Также stat (2) и statfs (2) syscalls.

Помните, что другие процессы могут (и часто делают) писать в файловую систему, пока ваша программа исследует или запрашивает ее. И ваш пользователь может запускать новые процессы (возможно, косвенно, например, с помощью crontab (5) , system (3) , fork (2) и execve (2) , at, batch, ssh ...) в любое время.

Прочтите также хорошую книгу по программированию для Linux, возможно, старую Расширенное программирование для Linux и syscalls (2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...