Или предположим, что система * BSD (для ps
непереносим, и OpenBSD удалила / proc
несколько выпусков назад)
ps -o uid,gid -p ...
Чтобы ответить на ваш вопрос: rsync
, насколько мне известно, не имеет встроенного способа узнать, что какая-то отдельная запущенная вами программа (веб-браузер и т.д.) активно изменяет файл.
Учитывая ваш тип резервного копирования (запуск через один и тот же источник и место назначения каждые 30 минут), вы можете добиться окончательного удаления любых промежуточных файлов, имена которых отличаются от имен конечного файла (например, download_1.zip.tmp
может быть промежуточным файлом для download_1.zip
), добавив в команду опцию --delete
.
Во время первого запуска rsync
файл download_1.zip.tmp
будет скопирован в местоположение резервной копии. Если предположить, что загрузка завершится в течение 30 минут, промежуточный файл download_1.zip.tmp
будет переименован в download_1.zip
. После следующего запуска rsync
, rsync
больше не находил промежуточный файл download_1.zip. tmp
(потому что он был переименован в download_1.zip
) и удалит download_1.zip.tmp
и заменит его на download_1.zip
в резервной копии. Это также удалит любые другие файлы из резервной копии (/mnt/dsbackup
), которые больше не существуют в источнике (/mnt/datastore
).
Из руководства rsync
(версия 3.1.0):
Это указывает rsync удалять лишние файлы с принимающей стороны (те, которых нет на передающей стороне), но только для каталогов, которые синхронизируются. Вы должны были попросить rsync передать весь каталог (например, "dir" или "dir/"), не используя подстановочный знак для содержимого каталога (например, "dir/*"), так как подстановочный знак расширяется оболочкой, и rsync получает запрос на передачу отдельных файлов, а не родительского каталога файлов. Файлы, исключенные из передачи, также исключаются из удаления, если вы не используете опцию --delete-excluded или не отметите правила как соответствующие только передающей стороне (см. модификаторы include/exclude в разделе FILTER RULES).