Здравствуйте, коллеги.
Имею в хозяйстве систему видеонаблюдения: сервер (обычный ПК), несколько ip видеокамер Acti, Axis, PoE инжекторы к камерам, гигабитный хаб.
Сервер представляет из себя обычный ПК с двумя сетевыми картами, 2 жестких диска (320GB системный, 2000GB под архив с фотографиями ), операционная система Linux Centos 6 x64, помимо базовой системы установлены пакеты: motion, samba, ntp, nload, htop, mc .
Сервер через отдельный гигабитный хаб соединен с камерами, motion пишет фотографии при движении, нужные юзеры просматривают архив по samba, в cron запихнут скрипт удаления старых фотографий при переполнении диска.
Данное решение было выбрано потому что нужна была максимальная глубина архива. В зависимости от места установки камеры получается 1.5 — 3ГБ ( до 10000 фотографий) в день на одну камеру. Разрешение фотографии 1280*800 , размер около 125КБ. Также хочу заметить что motion вообще не грузит процессор, к серверу подключено в данный момент 5 камер, загрузка сети 25 Мбит/с, загрузка процессора 5% (Intel(R) Core(TM) i3 CPU 550 @ 3.20GHz), load average 0.06 0.13 0.19 .
Полный путь до файла сейчас выглядит так /mnt/2000gb/photo/camera05/2014/12/03/2014_12_03_00_14_51-01.jpg .
Удалять старые файлы нужно было только при заполнении диска, например до 90%. Для этого я написал следующий скрипт. Скрипт был запихнут в cron выполнятся раз в час.
#!/bin/sh
#Скрипт удаления старых файлов при переполнении диска
# $1 - доспустимый размер занятого места в процентах, например 90, без знака процентов %
# $2 - точка монтирования, например /mnt/2000gb
# $3 - имя каталога для очистки старых файлов, например /mnt/2000gb/photo
# запускать так sh remove-old.sh 90 /mnt/2000gb /mnt/2000gb/photo
if [ "$#" -eq 3 ]
then
#Определяем переменные из аргуметов переданных скрипту
NOT_MORE_PERCENT=$1
MOUNT_POINT=$2
TARGET_DIRECTORY=$3
#Определяем процент занятого места на диске по точке монтирования этого диска
REAL_PERCENT=$(df -h | grep $MOUNT_POINT | awk '{print $5}' | sed 's/.$//')
#В случае если реальный процент больше или равен заданному значению удаляем лишние файлы
if [ "$REAL_PERCENT" -ge "$NOT_MORE_PERCENT" ]
then
#Определяем дату самого старого файла путем обратной сортировки по имени
cd $TARGET_DIRECTORY
MOST_OLD_DATE=$(ls -1ARrl --time-style=long-iso | tail -n1 | awk '{print $6}')
#Определяем даты +день и -день от самой старой даты, нужно для корректного задания временнного диапазона команды find
DAY_BEFORE_MOST_OLD_DATE=$(date -d "$MOST_OLD_DATE -1 days" "+%Y-%m-%d")
DAY_AFTER_MOST_OLD_DATE=$(date -d "$MOST_OLD_DATE +1 days" "+%Y-%m-%d")
#Находим все файлы заданной даты в нашем каталоге и удаляем, удаляются только файлы!!!
find $TARGET_DIRECTORY -type f -newermt "$DAY_BEFORE_MOST_OLD_DATE 23:59:59" -not -newermt "$DAY_AFTER_MOST_OLD_DATE" -delete
#Находим все пустые директории в заданной директории и удаляем
find $TARGET_DIRECTORY -type d -empty -delete
else
#В случае если реальный процент меньше заданного значения ничего не делаем
echo "Еще есть немножко свободного места"
exit 0
fi
else
echo "Количество аргументов должно быть равно 3-м"
echo "Введенное количество аргуметов $#"
exit 1
fi
И он работал если файлов было не более 50GB. Сейчас он выполняется настолько долго что ничего не происходит. Виснет на выполнении команды
#Определяем дату самого старого файла путем обратной сортировки по имени
ls -1ARrl --time-style=long-iso | tail -n1 | awk '{print $6}'