业务需要从几个源资源服务器同步很多图片文件到其他N个目的服务器上去, 各个目的服务器上都启了syncd服务, 写了个脚本, 之前运行都很正常, 不过突然近几天源服务器更新过的图片, 都没有更新到目的服务器上去。 查看了下脚本的运行日志, 发现有日志里有很多
rsync: mkstemp "/PP/20090826/PP2009082600104/.pp2009082600104_S-D688.jad.ZjCEyJ" (in pp_resource) failed: Permission denied (13)
在网上搜了下mkstemp, 是glibc提供的函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。
rsync在同步文件的时候, 接收端会从发送端的数据中读取由文件索引号确认的文件. 然后打开本地文件(被称为基础文件), 建立一个临时文件. 接收端会读取非匹配数据和匹配数据, 并按顺序重组他们成为最终文件. 当非匹配数据被读取, 它会被写入到临时文件. 当收到一个块匹配记录, 接收端会寻找这个块在基础文件中的偏移量, 将这个块拷贝到临时文件. 通过这种方式, 临时文件被从头到尾建立起来. 建立临时文件的时候生成了文件的校验. 重建文件结束后, 这个校验和来自发送端的校验比较. 如果校验不符, 临时文件会被删除. 如果失败一次, 文件会再被处理一次. 如果失败第二次, 一个错误会被报告. 临时文件建立后, 所有者, 权限和修改时间会被设置. 然后它会被重命名已替代基础文件.
rsync 默认以同步的目标目录作为缓存区创建临时文件以实现同步操作过程中的各种判断、比较、分析等后台操作。 Permission denied说明目标目录的写权限有问题。
在rsync的时候加上--temp-dir=/tmp选项指定其他的目录作为临时文件生成的目录, 发现另外一种错误:
rsync: rename "/data1/apache/htdocs/resource/PP/tmp/.PP2009083100018.JVYKso" (in pp_resource) -> "PP/20090831/pp2009083100018/pp2009083100018": Permission denied (13), 这进一步确认可能是目标服务器上的目标目录的权限可能有问题, 登录到目标主机, 查看了一下我目标目录的权限, 果然有几个目录的所有者被人改成了root, chown成我使用的普通用户之后, 再重新执行rsync, 顺利通过
阅读(7684) | 评论(0) | 转发(0) |