Являются ли cp/rsync асинхронными?

Являются ли cp/rsync асинхронными?

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

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

решение1

Одним из решений является переписывание его следующим образом:

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этот сеанс оболочки ждать, пока все дочерние процессы не завершатся, чтобы продолжить работу.

решение2

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

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

sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches

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

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

Связанный контент