Мы запускаем скрипт резервного копирования, который сначала копирует файл в место назначения, а затем запускает tar
над ним.
DIR2BCK='/foo/bar'
TMPDIR=$(mktemp -d)
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1
tar czf /tmp/foo.backup.tar ${TMPDIR}
После выполнения этой последней команды иногда отображается следующее предупреждение:
/tmp/tmp.blqspkA136: файл изменился, когда мы его читали
Мы копируем место назначения во временный каталог точно, чтобы избежать изменений файла во время сжатия. Это поведение также воспроизводимо при использовании команды cp
вместо rsync
. Всю свою жизнь я думал, что эти команды были синхронными, но это предупреждение, кажется, показывает обратное.
Если я помещу команду sleep
между rsync
/cp
и tar
линиями, предупреждение не появится, но я считаю это не совсем чистым решением.
Некоторые факты:
- Я попытался добавить команду
sync
между командамиrsync
иtar
с тем же результатом. По предложению @jcbermu я также попытался изменить скрипт так, чтобы две строки:
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 & wait
Я запускаю скрипт несколько раз, и некоторые из них демонстрируют одинаковое поведение, утверждая, что файл изменился при копировании.
Используемая файловая система EXT4 для
${TMPDIR}
и${DIR2BCK}
.${DIR2BCK}
находится на удаленной файловой системе, на самом деле это точка монтирования samba удаленной машины.${TMPDIR}
находится в локальной файловой системе. Однако замена${DIR2BCK}
на локальную файловую систему не имеет значения.- Все файловые системы основаны на аппаратном RAID-5.
Эти команды на самом деле синхронны? Если нет, есть ли способ сделать их так, или альтернативная команда?