2010-03-30 90 views
0

我编写了几个脚本来监视上传目录的更改,然后捕获上传/更改的文件并使用ruby脚本将其推送到云文件。这一切在95%的时间内都可以正常工作,唯一的例外是偶尔的,ruby失败,并且'文件不存在'异常。使用inotify-tools和ruby将上传推送到云文件

我假设ruby'push'脚本在文件在其新位置被调用之前被调用,所以脚本被过早地调用了一点。

我试着在我的脚本中添加一个小函数来检查文件是否存在,如果不存在,那么sleep 5然后再试一次,但是这似乎是雪球并最终死亡。然后,我给所有的呼叫添加了睡眠2,但它没有帮助,因为我现在再次遇到'文件不存在'的错误。

#!/bin/sh 

function checkExists { 
    if [ ! -e "$1" ] 
    then 
      sleep 5 
      checkExists $1 
    fi 
} 

inotifywait -mr --timefmt '%d/%m/%y-%H:%M' --format '%T %w %f' -e modify,moved_to,create,delete /home/skylines/html/forums/uploads | while read date dir file; do 
    cloudpath=${dir:20}${file} 
    localpath=${dir}${file} 
    #checkExists $localpath 
    sleep 2 
    ruby /home/cbiggins/bin/pushToCloud.rb skylinesaustralia.com $cloudpath $localpath 
    echo "${date} ruby /home/cbiggins/bin/pushToCloud.rb skylinesaustralia.com $cloudpath $localpath" >> /var/log/pushToCloud.log 
done 

我正在寻找任何建议,以帮助我使这个100%的稳定(最终,我会为来自云文件上传的文件,所以我需要确保其完美的)

谢谢提前!

编辑 - 解决了! - 我正在看'删除'事件...所以,当本地文件被删除时,这个脚本正在触发,这个文件不存在。德尔。 :)

回答

1

你确定它不是上传文件中的空间吗?尝试在传递给脚本的参数周围添加引号!

+0

良好的调用,但文件名由上传脚本预先处理,所以我知道输入是好的。 – Christian 2010-03-30 09:43:50

1

你的函数在没有退出的情况下递归地调用它自己。尝试改变它来代替使用while循环。

+0

伟大的想法,会放弃它。 – Christian 2010-03-30 11:34:03