В соответствии сэтот ответ, файлы аренды DHCPd очищаются каждый час. Цель состоит в том, чтобы постоянно создавать резервные копии файла аренды, чтобы ни одна аренда не была потеряна. Это осложняется тем, что неясно, основан ли часовой таймер на системном времени (например, файл перезаписывается в 1, 2, 3 и т. д.) или на времени процесса (service_start + 1 ч, service_start + 2 ч и т. д.). Допустим, файл аренды очищается ровно в 3 часа ночи, а аренда предоставляется в 2:58:55; служба, которая создает резервную копию файла аренды, должна будет запуститься быстро, прежде чем файл будет очищен.
Процесс DHCPd создает собственную резервную копию файла в /var/lib/dhcpd/dhcpd.leases~
. Лучшим вариантом тогда, по-видимому, будет создание скрипта, который будет создавать резервную копию этого файла в другом месте каждый час. Но если процесс DHCPd перезапускается и таймер относительен к процессу, то возможно совпадение часовых меток в задачах резервного копирования, что может привести к тому, что один процесс будет читать, а другой — писать, и это может испортить файл (в зависимости от того, как это делается). Поэтому для задачи резервного копирования потребуются некоторые знания о том, когда запускается DHCPd. Это становится сложным.
Каков «правильный» способ резервного копирования файла аренды DHCPd, чтобы не потерять ни одну аренду?
решение1
if (snprintf (backfname, sizeof backfname, "%s~", path_dhcpd_db) >= sizeof backfname) [...] if (unlink (backfname) < 0 && errno != ENOENT) { [...] if (link(path_dhcpd_db, backfname) < 0) {
Предыдущий файл резервной копии удаляется, затем текущий файл аренды жестко связывается как резервная копия с конечным расширением ~
.
В Linux сinotify(7)возможность создания события, жесткая ссылка рассматривается как событие создания.
Я бы предложил использовать inotifywait
(из inotify-tools
пакета) для сигнализации о том, что произошло такое событие. Следует ожидать появления, которое /var/lib/dhcpd/dhcpd.leases~
затем будет напрямую готово к резервному копированию (это жесткая ссылка на оригинал). Поскольку файл будет каждый раз другим файлом (другим inode), это каталог, за которым следует следить для правильного обнаружения, и, например, этот --include
параметр можно использовать для упрощения обработки оболочки (никакой обработки, даже прочитанная строка отбрасывается в фиктивной переменной):
inotifywait -m -e create --include dhcpd.leases~ /var/lib/dhcpd | while read dummy; do
do_backup /var/lib/dhcpd/dhcpd.leases~
done
Если команда не достаточно свежая, она может быть не понята --include
, в таком случае тест необходимо выполнить в цикле событий:
inotifywait -m -e create /var/lib/dhcpd | while read -r dir event filename; do
if [ "$filename" = dhcpd.leases~ ]; then
do_backup /var/lib/dhcpd/dhcpd.leases~
fi
done
В качестве альтернативы incron
пакет (доступный по крайней мере в CentOS 8 Stream) можно использовать свходпохожий на:
/var/lib/dhcpd IN_CREATE,recursive=false if_correct_file_do_backup $#
например if_correct_file_do_backup
, если оболочка проверяет, что это предполагаемое имя файла:
#!/bin/sh
if [ "$1" = dhcpd.leases~ ]; then
do_backup /var/lib/dhcpd/dhcpd.leases~
fi