null

Ротация записей с камер видеонаблюдения

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

Удаление старых записей

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

Реализовать это можно средствами утилиты find, входящей в состав большинства Unix-подобных операционных систем:

find '/storage/cctv/archive/' -mtime +30d -delete

Количество дней хранения файлов задаётся аргументом +30d, который, очевидно, означает, что будут удалены файлы, старше 30 дней.

Удаление записей при превышении определённого размера

Более нетривиальной задачей является ограничение хранимого архива видео по занимаемому на диске месту.

Здесь потребуется более сложная логика, включающая подсчёт занимаемого места с помощью утилиты du и затем так же итерация через все файлы с помощью find:

#!/bin/sh

while [ $(du -s "$1" | cut -f1) -gt "$2" ]
do
	find "$1" -type f -printf '%T@ %p\0' | sort -z | perl -0ne 'print and exit for / (.*)/s' | xargs -0 rm
done

Пример использования:

./rotate_archive '/storage/cctv/archive/' 104857600

Вторым аргументом указывается целевой размер архива в килобайтах. Для примера указан размер 100 ГБ.

Разберём подробнее данный скрипт:

# Подсчитываем размер файлов в каталоге
du -s "$1"
> 71982166        /storage/cctv/archive

# Вырезаем лишнее
du -s "$1" | cut -f1
> 71982166

# Проверяем, что объём данных меньше указанного
[ $(du -s "$1" | cut -f1) -gt "$2" ]
# Если это не так, удаляем по одному самому старому файлу, пока размер не достигнет заданного

# Выводим список всех файлов в указанном каталоге, с указанием времени модификации в формате unix timestamp, разделяя их символом с кодом ноль (\0), а затем сортируем
find "$1" -type f -printf '%A@ %p\0' | sort -z
> 1508231804.2142760000 ./test4
> 1508231804.3882530000 ./test5
> 1508231809.3913270000 ./test6
> 1508231816.4635520000 ./test7
> 1508231824.2758510000 ./test8
> 1508231831.4412550000 ./test9
> 1508235003.3879140000 ./test1

# Выбираем имя первого (самого старого) файла
perl -0ne 'print and exit for / (.*)/s'
>./test4

# Удаляем его, передав как аргумент утилите rm
xargs -0 rm

Ежедневный запуск скриптов

Для запуска можно использовать утилиту cronntab, запустив её командой

crontab -e

А затем дописав в открывшийся файл конфигурации следующие строки:

#mm hh dom mon dow command
 00 00 *   *   *   find '/storage/cctv/archive/' -mtime +30d -delete
 00 00 *   *   *   /root/cleanup.sh '/storage/cctv/archive/' 104857600

Данная конфигурация будет запускать скрипты каждую полночь.