这个问题源自我在Stackoverflow上提出的另一个问题。我正在使用Watcher - 相同的问题也适用于Incron - 来监视文件夹及其子文件夹的更改,并将这些更改悄悄地保存到Dropbox。
我监视write_close
事件 - IN_CLOSE_WRITE
- 是为了这个目的。最初,我是在监听modify
事件,即IN_MODIFY。虽然这样可以工作,但我发现当写入大文件时,它会触发多次。听起来很合理,所以我切换到了IN_CLOSE_WRITE
,因为我觉得对于给定的文件,它只会发生一次。
目前,我通过让我的同步脚本在执行任何其他操作之前休眠10秒钟,并在尝试进行Dropbox同步之前检查相关文件是否仍然存在来解决这个问题。这样做是有效的,因为在第二次迭代中,该文件已经不存在,脚本会直接终止。
这听起来像是一种取巧的方法。或许不算是坏办法,但我更希望能够理解 - 为什么连
IN_CLOSE_WRITE
事件会多次发生呢?
一些额外的信息
- 检查以确保没有多个 watcher 运行的实例。
ps ax|grep watcher.py
的输出
23880 ? Sl 0:01 python /usr/local/bin/watcher.py restart
24977 pts/0 S+ 0:00 grep --color=auto watcher.py
文件系统是
ext4
。我应该提到,我在使用Incron时遇到了完全相同的问题。我通过一个批处理脚本从/etc/rc2.d
执行启动Watcher守护进程。而Incron则通过默认的apt-get install incron
安装自动启动,无需我进行任何操作。
我的
watcher.ini
文件的核心内容如下所示。[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid
[job1]
watch=/path/to/watch
events=write_close
excluded=
recursive=true
autoadd=true
command=/home/datastore.php $filename
我将
datastore.php
脚本简化到最基本的程度,以验证它是否被启动了两次,而没有我的混乱的Dropbox上传+源代码删除的代码。#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
然后我在问题路径下创建了一个小文件,然后检查了/tmp/watcher
。问题仍然存在-该文件仍然有两个连续的$argv[1]
条目。
ext4
,我相当确定没有两个Watcher实例正在运行。我在使用Incron时也遇到了同样的问题。 - DroidOSunlink
,问题仍然存在。 - DroidOS