rsync目录,所以所有的变化都以primefaces方式出现

我为本地networking做了一些经常使用的仓库的每晚和每周的镜像。 有几次,有人试图做一个更新,而rsync发生和失败,因为预期的文件还没有那里。

是否有可能做一个rsync,使所有更改的文件只有完成时显示正确的名称? 我知道rsync使用临时.hidden文件,而每个传输正在进行,但我可以推迟重命名,直到它完成了某种?

或者,似乎我可以使用–backup选项将所有更改移动到一个目录,然后primefaces地移动它们,但是我希望该function与现在的function相反。

我在Linux上的价值。

您可以使用--link-dest=选项。 基本上你会创build一个新的文件夹,所有的文件都硬链接到新的文件夹。 当一切都完成后,你可以交换文件夹的名称,并删除旧的。

因为没有对内核/ VFS的支持,所以在Linux中完成100%primefaces是不可能的。 然而,交换名字实际上只有两个系统调用,所以它应该用不到一秒的时间来完成它。 只有在达尔文(MAC / OSX)上才可能在HFS文件系统上调用interchangeata系统。

我做了一些类似的rsync备份[到磁盘],我遇到了同样的问题,因为守护程序在备份运行时更新文件。

与许多程序不同,rsync有许多不同的错误代码[见手册页底部]。 有趣的是两个:

23 – 由于错误导致的部分转移
24 – 由于消失的源文件导致的部分转移

当rsync进行传输并遇到其中一种情况时,它不会立即停止。 它跳过并继续可以传输的文件。 最后,它提供了返回码。

所以,如果你得到错误23/24,只需重新运行rsync。 随后的运行速度会更快,通常只是传输上一次运行中丢失的文件。 最终,你会得到(或应该得到)一个干净的运行。

至于primefaces,我在转移过程中使用“tmp”目录。 然后,当rsync运行干净,我把它[primefaces]重命名为<date>

我也使用--link-dest选项,但我使用它来保持delta备份(例如,每天的--link-dest=yesterday

虽然我自己并没有使用它,但是--partial-dir=DIR可能会使隐藏文件不能将备份目录--partial-dir=DIR 。 确保DIR与你的备份目录在同一个文件系统上,所以重命名将是primefaces的

当我在perl中这样做的时候,我写了一个脚本来总结一下我所说的内容,对于你的特定情况,有一些细节/精确性。 它采用类似于tcsh的语法,[未经testing和有点粗糙],但将其视为伪代码来编写自己的bashperlpython脚本。 请注意,它对重试没有限制,但可以根据您的意愿轻松添加。

 #!/bin/tcsh -f # repo_backup -- backup repos even if they change # # use_tmp -- use temporary destination directory # use_partial -- use partial directory # use_delta -- make delta backup # set remote server name ... set remote_server="..." # directory on server for backups set backup_top="/path_to_backup_top" set backup_backups="$backup_top/backups" # set your rsync options ... set rsync_opts=(...) # keep partial files from cluttering backup set server_partial=${remote_server}:$backup_top/partial if ($use_partial) then set rsync_opts=($rsync_opts --partial-dir=$server_partial) endif # do delta backups if ($use_delta) then set latest=(`ssh ${remote_server} ls $backup_backups | tail -1`) # get latest set delta_dir="$backup_backups/$latest" if ($#latest > 0) then set rsync_opts=($rsync_opts --link-dest=${remote_server}:$delta_dir) endif endif while (1) # get list of everything to backup # set this to whatever you need cd /local_top_directory set transfer_list=(.) # use whatever format you'd like set date=`date +%Y%m%d_%H%M%S` set server_tmp=${remote_server}:$backup_top/tmp set server_final=${remote_server}:$backup_backups/$date if ($use_tmp) then set server_transfer=$server_tmp else set server_transfer=$server_final endif # do the transfer rsync $rsync_opts $transfer_list $server_transfer set code=$status # run was clean if ($code == 0) then # atomically install backup if ($use_tmp) then ssh ${remote_server} mv $backup_top/tmp $backup_backups/$date endif break endif # partial -- some error if ($code == 23) then continue endif # partial -- some files disappeared if ($code == 24) then continue endif echo "fatal error ..." exit(1) end 

不知道这是否会帮助你,但…

如果您不介意每次都复制整个数据集, 并且如果您可以使用符号链接来引用目标目录,那么您应该能够将所有内容rsync同步到一个临时目录中,然后交换( rename() )旧的和新的符号链接,如下所示:

 % mkdir old_data new_data % ln -s old_data current % ln -s new_data new % strace mv -T new current 

运行

rename("new", "current") = 0

并给出

 current -> new_data 

即使这样做,任何尝试从这个设置中读取的客户端都应该在尝试读取之前先将其放入到符号链接所引用的目录中,否则他们可能会从旧的副本中加载一些代码/数据部分,而从新的部分加载。

镜像自动同步( cron任务或类似)? 如果是这样,你可能使用专门的操作系统用户,我是对的? 所以解决scheme可以是,而不是简单地复制:

  1. 设置目标目录权限,以便只有rsync能够访问它。
  2. 继续同步。
  3. 更改目标的权限(无条件),以便其他人可以再次访问它。

缺点是在同步过程中(不知道需要多长时间)目标目录将不可访问。 你需要决定自己在这里是否可以。