Узнайте, какие пользователи занимают больше всего дискового пространства на нашем сервере данных.

Вопрос или проблема

Мы должны хранить наши текущие проекты на довольно маленьком (~4TB) сервере данных. Неудивительно, что он постоянно переполнен, и людям приходится вручную перемещать менее свежие файлы.
Существует ли простой (т.е. стандартный командный) способ узнать, какие пользователи занимают больше всего места в директории? т.е. суммируя размер всех файлов в директории и всех поддиректориях, принадлежащих каждому пользователю?

Редактировать: идеальным вариантом было бы не следовать за символическими ссылками

Чтобы узнать использование диска всеми пользователями на диске, вы можете использовать следующий скрипт:

#! /bin/bash

DIRECTORY_TO_SCAN=/home

readarray -t user_list<<<"$(cat /etc/passwd | cut -d ':' -f 1)"

for u in "${user_list[@]}" ; do
        printf "Сканирование для пользователя: %30s" "$u"
        du -ch $(find "$DIRECTORY_TO_SCAN" -user "$u" 2>/dev/null) 2>/dev/null | sed -e '/total/!d;s/^/    /'
done

Этот скрипт просканирует список всех пользователей, найдет файлы, которые вы можете прочитать и которые они владеют, и вычислит общее пространство, занимаемое этими файлами.


(Часть ниже сохранена для полноты)

Если вы хотите узнать полный размер директории, вы можете использовать команду du:

du -sh directory1 directory2

это выведет размер директории и всего её содержимого.

Чтобы фактически решить вашу проблему, вы можете использовать квоты для пользователей (или группы). Это позволит вам получить детализированный отчет о том, сколько места занимает каждый пользователь/группа, и установить жесткие ограничения на то, сколько места они могут использовать.

В таких ситуациях я обычно сначала использую du -kx | sort - rn | less, чтобы перечислить директории в порядке убывания. Это говорит мне, где находятся самые большие потребители дискового пространства, и я буду знать, где искать. Но, как сказал @SimonDoppler, если у вас нет хотя бы r-x доступа ко всем поддиректориям, ваш список будет неполным: вы сможете получить размеры только тех директорий, к которым у вас есть доступ.

Помните: обычно вам нужно иметь только право на запись в директорию, чтобы удалить любые файлы в ней. Только если в директории установлен бит sticky (т.е. последняя буква в строке разрешений – t, а не x), вам нужно быть владельцем файла, чтобы удалить его.

Если квота недоступна, вам может потребоваться сделать что-то подобное:

#!/bin/sh
if [ "$1" = "" ] || [ "$1" = "-h" ]
then
    echo "Использование: ${0##*/} <директория> <имя пользователя(ей)...>" >&2
    exit 64 # EX_USAGE
fi
if ! [ -d "$1" ]
then
    echo "ОШИБКА: директория $1 не существует" >&2
    exit 66 # EX_NOINPUT
fi

REPORTROOT="$1"
shift
for U in "$@"
do
    # Найдите все файлы под $REPORTROOT, принадлежащие определенному пользователю,
    # получите их размеры и суммируйте их.
    DISKUSE=$(find "$REPORTROOT" -type f -user "$U" \
        -exec stat -c %s {} \+ 2>/dev/null \
        | awk '{s+=$1} END {printf("%ld\n", s)}')
    # Отобразите результат для этого пользователя.
    printf "%16s: %d\n" "$U" "$DISKUSE"
done

Обратите внимание, что выполнение этого может занять некоторое время.

Строка awk для “подсчета суммы списка чисел” взята из этого сообщения Stack Overflow. Обратите внимание на комментарии к ответу.

Ответ или решение

Чтобы выяснить, какие пользователи занимают наибольшее количество дискового пространства на нашем сервере данных, можно использовать несколько подходов с командной строкой на Unix-подобных системах. Основной метод — воспользоваться командой find в сочетании с du и awk, чтобы вычислить размер всех файлов, принадлежащих каждому пользователю в заданном каталоге.

Вот пример скрипта, который решает эту задачу:

#! /bin/bash

DIRECTORY_TO_SCAN=/home  # Укажите каталог, который необходимо просканировать

# Читаем список пользователей из файла /etc/passwd
readarray -t user_list < <(cut -d ':' -f 1 /etc/passwd)

for u in "${user_list[@]}" ; do
    # Суммируем размер файлов для каждого пользователя
    DISKUSE=$(find "$DIRECTORY_TO_SCAN" -user "$u" -type f -exec stat -c %s {} + 2>/dev/null | awk '{s+=$1} END {printf("%ld\n", s)}')
    if [ -n "$DISKUSE" ]; then
        printf "%16s: %d байт\n" "$u" "$DISKUSE"
    fi
done

Объяснение скрипта:

  1. DIRECTORY_TO_SCAN: Установите переменную для каталога, который вы хотите просканировать (например, /home).

  2. Список пользователей: Мы извлекаем список пользователей из файла /etc/passwd, используя команду cut, и сохраняем его в массив user_list.

  3. Цикл по пользователям: Для каждого пользователя мы используем команду find, чтобы отыскать все файлы, принадлежащие этому пользователю, и суммируем их размеры с помощью stat и awk. Полученная сумма выводится в виде числа байт.

  4. Фильтрация: Если размер дискового пространства пользователя равен нулю (то есть нет файлов), вывод не отображается.

Важные заметки:

  • Скрипт не следует за символическими ссылками (symlinks), так как мы используем только обычные файлы (-type f).
  • Убедитесь, что у вас есть необходимые разрешения для доступа к файлам в указанном каталоге.
  • Для больших каталогов работа скрипта может занять продолжительное время.

Альтернативный подход:

Если ваш сервер поддерживает использование квот, рекомендуется настроить пользовательские или групповые квоты. Это позволит не только отслеживать, сколько пространства занимает каждый пользователь, но и устанавливать ограничения на использование дискового пространства. Инструкции по настройке квот можно найти в официальной документации для вашей операционной системы.

Дополнительный метод:

Вы также можете использовать команду du, чтобы получить информацию о большом количестве данных:

du -sh /home/* | sort -hr | less

Эта команда обеспечит отображение размеров всех каталогов в /home, упорядоченных по размеру.

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

Оцените материал
Добавить комментарий

Капча загружается...