Как параметр rsync --на месте работает с резервным копированием --?

Решение :добавить шебанг #!/bin/bashв начало скрипта

Вы можете принудительно использовать нужную оболочку с помощью первой строки :#!/bin/bash, что является еще одним способом сделать то, что вы делаете с помощьюbash./myscript...

#!/bin/bash

...
...
source "/opt/config/test.config"
...
...

Возможное объяснение вашей проблемы

Нет sourceвстроенной -команды в оболочкеsh(и нет программы с именемsource). Поэтому, если ваш скрипт запускается с помощью sh, он завершится ошибкой в ​​командной строке с source.

0
14.12.2020, 13:16
1 ответ

Практически невозможно сослаться на файл по его индексному узлу. Чтобы открыть файл, необходимо открыть ссылку на имя файла в каталоге. Затем у вас есть дескриптор файла, который теперь не зависит от имени файла (, поэтому файл может быть удален из файловой системы, но при этом оставаться открытым и активным ). Итак, давайте предположим, что файл остается открытым на протяжении всего жизненного цикла приложения. Теперь вам нужно заменить содержимое этого файла, используя rsync.

Обычно rsyncсоздает временную копию целевого файла вместе с любым существующим экземпляром, а затем в последний момент удаляет (или создает резервную копию )оригинала и включает замену. Это поведение можно изменить с помощью опции --inplace, так что вместо создания новой копии rsyncбудет выполнять запись в реальную цель.

Теперь вы также указали --backup, так что rsyncпоступает правильно и создает копию для резервной копии, прежде чем позволить --inplaceобновить исходный экземпляр. Вы можете увидеть это на коротком примере:

# Prepare scenario
mkdir /tmp/624404
cd /tmp/624404
date >src
cp -p src dst

# Initial files, with inodes
ls -li src dst
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:49 src

# Update, copy, and list
date >src
rsync --times --inplace --backup src dst
ls -li
total 12
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst
149194 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst~
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src

# Update again, copy, and list
date >src
rsync --times --inplace --backup src dst
ls -li
total 12
149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst
149194 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst~
137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src

Вы видите, что целевой(dst)файл по-прежнему имеет исходный индексный дескриптор, но резервной копии был присвоен новый индексный дескриптор. Второе обновление показывает, что после этого индексные дескрипторы сохраняются.

В вашем случае кажется, что --inplace --backup— это то, что вам нужно. Однако обратите внимание, что справочная страница предупреждает:

WARNING: you should not use this option to update files that are being accessed by others, so be careful when choosing to use this for a copy.

Причина того, что --inplaceне является значением по умолчанию, заключается в том, что прерванное частичное копирование может оставить целевой файл в несогласованном состоянии,и автор (s )решил, что лучше иметь внутренне непротиворечивый исходный -из -файл даты, чем поврежденный -из -файл даты. Такое поведение можно изменить с помощью таких флагов, как --inplaceи--partial(и даже --appendс rsyncверсии 3.0.0 и выше ).

1
18.03.2021, 22:43

Теги

Похожие вопросы