2

Мы запускаем скрипт резервного копирования, который сначала копирует файл в место назначения, а затем запускает 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.

Эти команды на самом деле синхронны? Если нет, есть ли способ сделать их так, или альтернативная команда?

2 ответа2

0

Одним из решений является переписать его как:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 ; tar czf foo.backup.tar ${TMPDIR}

Итак, tar не запустится, пока не закончится rsync .


Другим решением является отправка cp/ rsync в фоновый режим и ожидание, пока оно не закончится командой wait .

Например:

rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
wait
tar czf foo.backup.tar ${TMPDIR}

Последняя строка & в строке rsync отправляет выполнение в фоновый режим (он становится дочерним элементом текущего сеанса), а затем wait заставляет этот сеанс оболочки ждать, пока все дочерние элементы не закончили, чтобы продолжить.

0

Я помещаю команду sleep между rsync/cp и tar-строкой, предупреждение не появляется, но я считаю это не совсем чистым решением.

Хорошо для вас или иметь стандарты. Что произойдет, если вместо сна вы используете:

синхронизация sudo; эхо 3 | sudo tee /proc /sys /vm /drop_caches

Считаете ли вы это хорошим решением?

Примечание: похоже, что Ubuntu использует /proc /sys /vm /drop_caches и не подходит для всех Unix-систем (хотя, может быть, для всех Linux). Я упоминаю об этом после прочтения https://ubuntuforums.org/showthread.php?t=589975 и, после прочтения первоначального отчета, ставящего под сомнение безопасность этого, прочитайте больше постов на форуме, подтверждающих его безопасность.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .