使用 rsync 时忽略正在使用(正在写入)的文件

使用 rsync 时忽略正在使用(正在写入)的文件

我有一台 SFTP 服务器,客户端不断上传大文件。我想定期复制所有完全的(完全上传)文件到另一台机器进行处理。我不想复制正在写入的文件。有办法实现吗?我目前正在使用 rsync,但我愿意切换到其他东西。

答案1

要检查文件当前是否打开(如果文件当前已被写入,则肯定由某个进程打开),标准方法是使用lsof

if lsof /your/file > /dev/null; then echo "file currently open"; fi

您可以使用此代码片段来过滤未打开的文件的查找结果,并使用它们来提供给 rsync:

find . -type f -exec sh -c 'if ! lsof `readlink -f {}` > /dev/null; then echo `basename {}`; fi' \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- ./ user@host:destination/

一些说明:

  • readlink -f需要有文件的完整路径,lsof 仅接受完整路径
  • tr '\n' '\0'模拟查找-print0

答案2

这里的一个挑战是确定文件是否仍在写入。没有完美的方法来做到这一点。我认为你能做的最好的事情就是简单地检查文件的最后修改时间戳,并且只复制几分钟内没有被修改的文件。

rsync本身无法做到这一点,但你可以将它与查找命令

cd /path/to/directory/with/files
find ./ -type f -mmin +5 -print0 | rsync --archive --verbose --from0 --files-from=- ./ yourotherserver:targetdir/

分解这个命令,它做两件事:

  1. 它用于find ./ -type f -mmin +5 -print0识别至少 5 分钟未被修改的所有文件。
  2. rsync然后,它使用--from0和参数将此列表输入--files-from。这将rsync仅考虑已识别的文件find

相关内容