ПРИМЕЧАНИЕ
Измените список каталогов в команде find
, чтобы он точно соответствовал структуре каталогов на вашем диске.
Сценарий выполняет поиск по целым файловым системам, поэтому не надо удивляться, что ему для работы требуется немало времени. В больших файловых системах процесс легко может занять промежуток между утренней чашкой чая и обедом. В листинге 5.2 приводится пример результатов работы сценария.
Листинг 5.2.Тестирование сценария fquota
$ sudo fquota
User taylor exceeds disk quota. Disk usage is: 21799.4 Mbytes
Как видите, пользователь taylor вышел из-под контроля! Объем его файлов составил 21 Гбайт, что намного больше квоты в 20 Гбайт, выделяемой каждому пользователю.
Усовершенствование сценария
Полноценный сценарий такого рода должен иметь возможность автоматически по электронной почте извещать нарушителей о том, что они заняли слишком много дискового пространства. Это усовершенствование демонстрируется в следующем сценарии.
№ 36. Уведомление о превышении квоты дискового пространства
Большинство системных администраторов стремятся найти самый простой способ решения проблемы, а самый простой способ организовать управление дисковыми квотами — добавить в сценарий fquota (сценарий № 35) рассылку предупреждений по электронной почте пользователям, занявшим слишком большой объем дискового пространства, как показано в листинге 5.3.
Листинг 5.3.Сценарий diskhogs
··#!/bin/bash
··# diskhogs — инструмент анализа расходования дискового пространства для Unix;
··#·· предполагается, что все учетные записи рядовых пользователей
··#·· имеют числовые идентификаторы UID >= 100.
··#·· Рассылает электронные письма с предупреждением всем нарушителям
··#·· и выводит на экран общий отчет.
··MAXDISKUSAGE=500
··violators="/tmp/diskhogs0.$$"
··trap "$(which rm) −f $violators" 0
··for name in $(cut −d: −f1,3 /etc/passwd | awk −F: '$2 > 99 { print $1 }')
··do
····/bin/echo −n "$name "
····# Вам может потребоваться изменить следующий список каталогов, чтобы
····#·· он лучше соответствовал структуре каталогов на вашем диске.
····#·· Наиболее вероятно, что вам придется заменить имя /Users на /home.
····find / /usr /var /Users −xdev −user $name −type f −ls | \
······awk '{ sum += $7 } END { print sum / (1024*1024) }'
··done | awk "\$2 > $MAXDISKUSAGE { print \$0 }" > $violators
··if [! -s $violators]; then
····echo "No users exceed the disk quota of ${MAXDISKUSAGE}MB"
····cat $violators
····exit 0
··fi
··while read account usage; do
··cat << EOF | fmt | mail −s "Warning: $account Exceeds Quota" $account
····Your disk usage is ${usage}MB, but you have been allocated only
····${MAXDISKUSAGE}MB. This means that you need to delete some of your
····files, compress your files (see 'gzip' or 'bzip2' for powerful and
····easy-to-use compression programs), or talk with us about increasing
····your disk allocation.
····Thanks for your cooperation in this matter.
····Your friendly neighborhood sysadmin
··EOF
····echo "Account $account has $usage MB of disk space. User notified."
··done < $violators
··exit 0
При создании этого сценария за основу был взят сценарий № 35. Изменения отмечены номерами
,
,
,
и
. Обратите внимание на дополнительную команду fmt в конвейере, передающем текст программе отправки электронной почты
.
Этот трюк помогает улучшить вид автоматически сгенерированного электронного письма, когда в тексте имеются поля неизвестной длины, такие как $account. Логика работы цикла for
несколько отличается от логики работы цикла for в сценарии № 35: так как вывод этого цикла предназначен исключительно для использования во второй части сценария, в каждой итерации он просто выводит имя учетной записи и объем занятого дискового пространства, а не сообщение об ошибке exceeds disk quota (превысил дисковую квоту).
Читать дальше