通过 rsync 发送文件时 inotify 识别的文件名错误

Posted

技术标签:

【中文标题】通过 rsync 发送文件时 inotify 识别的文件名错误【英文标题】:Wrong filename identified by inotify when file sent via rsync 【发布时间】:2015-11-03 16:45:17 【问题描述】:

我有以下脚本,它使用 inotify 来检测文件夹内的更改。如您所见,我将整个路径以及潜在新文件的名称保存在变量 VAR 下。 VAR 将类似于我在评论中的字符串。当我从另一个文件夹粘贴内容时,一切正常,但是当通过 rsync 将文件传输到那里时,VAR 类似于 this/is/the/path/.filename.log.JgHKzP 意思是在前面添加了句号文件名和 .XXXXXX 加在文件后面。例如我得到了这个

/home/user/CarMonitor/logs/gps/.gps-2015-11-3-18-7-41.log.QvPgm9

我的意思是我可以做一些字符串更改并使其正确,但为什么会发生这种情况?提前致谢。

#!/bin/bash
inotifywait -r -m /home/user/CarMonitor/logs -e create |        #Wait till new files arrive (Flags: -m for 'monitor', -e for 'event')
while read path action file; do
    #echo "The file '$file' appeared in directory '$path' via '$action'"    
    VAR=$path$file  
    #VAR="asddas/sd/f/sda/gps/sdfsdfsdfsd.log"  
    echo $VAR                                               
    //Do stuff
done

【问题讨论】:

【参考方案1】:

您看到的是一种常见的编程技术。它通常在程序要用新内容替换现有文件时使用。

假设您有一个名为 foo 的文件,您想用新版本替换它。您可以打开 foo 进行写入,这会截断文件,然后将新内容写入文件。但是假设您的程序崩溃或无法完成。你已经没有foo的好副本了——旧版本没有了,新版本是空的或不完整的。

相反,您的程序遵循以下步骤:

    打开一个具有不同名称的文件,例如.foo.tmp。 将新内容写入此新文件。 完成后,将.foo.tmp 重命名为foo

现在,如果您的程序未能完成,那么它将留下一个临时文件.foo.tmp。但是原始文件仍然存在,因此没有丢失任何内容。

Rsync 默认使用这种技术来更新文件。您的脚本订阅了创建事件,因此您看到了临时文件的创建。如果您要订阅移动事件,您可能会看到文件被重命名为正确的名称。

Rsync 有一些选项可以控制这种行为。 See the man page here 并搜索“--inplace”和“--partial”。

【讨论】:

感谢 Kenster 的详尽回答。正是我需要的。

以上是关于通过 rsync 发送文件时 inotify 识别的文件名错误的主要内容,如果未能解决你的问题,请参考以下文章

inotify+rsync实时备份总结

inotify介绍及rsync + inotify 实时同步备份

rsync+inotify实时同步

rsync+inotify文件实时同步

rsync+inotify搭建实时同步系统

Rsync+inotify搭建实时同步系统