ZFS
#!/usr/bin/env bash
THRESHOLD_MINUTES="${1:-10}"
now=$(date +%s)
zfs list -t snap | grep syncoid | while read -r line; do
# Извлекаем имя снапшота
snap=$(echo "$line" | awk -F@ '{print $2}' | awk '{print $1}')
# Извлекаем дату и время из имени снапшота
# Формат: syncoid_xxxx_YYYY-MM-DD:HH:MM:SS или syncoid_xxxx_YYYY-MM-DD:HH:MM:SS-GMTXX:XX
if [[ "$snap" =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}):([0-9]{2}:[0-9]{2}:[0-9]{2}) ]]; then
date_part="${BASH_REMATCH[1]}"
time_part="${BASH_REMATCH[2]}"
# Форматируем дату и время для команды date
datetime="${date_part} ${time_part}"
# Преобразуем в epoch time
snap_epoch=$(date -d "$datetime" +%s 2>/dev/null)
if [[ -n "$snap_epoch" ]]; then
diff=$(( now - snap_epoch ))
if (( diff > THRESHOLD_MINUTES * 60 )); then
minutes=$(( diff / 60 ))
hours=$(( minutes / 60 ))
remaining_minutes=$(( minutes % 60 ))
printf "%-80s <-- отставание %d часов %d минут\n" "$line" "$hours" "$remaining_minutes"
fi
else
echo "Ошибка преобразования времени для: $datetime" >&2
fi
else
echo "Не удалось извлечь дату из: $snap" >&2
fi
done
./filter_snaps.sh 120
bank/Replica1/subvol-112-disk-0@syncoid_bigbank3_2025-09-12:08:30:30 0B - 1.11G - <-- отставание 7 часов 52 минут
bank/Replica1/vm-108-disk-0@syncoid_bigbank3_2025-09-12:12:31:22 0B - 30.0G - <-- отставание 3 часов 51 минут
megabank/Replica1/subvol-181-disk-1@syncoid_r370_2025-09-12:13:52:01-GMT10:00 0B - 6.45G - <-- отставание 2 часов 30 минут
megabank/Replica3/vm-103-disk-1@syncoid_r370_2025-09-12:09:50:02-GMT10:00 773M - 2.97T - <-- отставание 6 часов 32 минут
megabank/Replica3/vm-103-disk-1@syncoid_r370_2025-09-12:10:50:02-GMT10:00 1.66G - 2.97T - <-- отставание 5 часов 32 минут
zfs list -H -o name -t snapshot | xargs -n1 zfs destroy