如何在Dropbox更新特定目录后触发脚本执行?

时间:2015-08-28 14:59:57

标签: python linux bash dropbox

我想在Dropbox更新对目录所做的更改后自动执行一个过程(也可以在子目录中进行更改)。

为了使其工作,监视脚本应该等待Dropbox报告同步状态为已完成,因为我不想在只更新某些文件时启动操作,或者并行启动多个执行。

这必须在Linux上运行,我已经将Dropbox无头守护进程配置为运行。我也有dropbox.py脚本,它似乎能够报告是否进行了同步。

./dropbox.py status
Up to date

我正在考虑使用cron作业,但我确实希望最小化dropbox完成同步的时刻和触发执行的那一刻之间的延迟。每分钟使用Cron似乎不是一个好方法,我更喜欢使用某种触发器的东西,而不是一个愚蠢的轮询。

3 个答案:

答案 0 :(得分:2)

我不知道Dropbox可以使用哪些触发器。这似乎是你与他们的支持部门联系的事情,因为他们毕竟是商业服务。

如果你发现自己陷入了轮询,你可以将你的python脚本包装在一个检查状态变化的循环中。

#!/usr/bin/env bash

postprocess() {
  # This function contains stuff you run after sync is complete.
}

# Initialize a flag.
dirty=true

# How many seconds between checks?
interval=1

# Poll every second. You could increase this number to reduce impact.
while sleep $interval; do

  if $dirty; then
    if /path/to/dropbox.py status | grep -q 'Up to date'; then
      dirty=false
      postprocess
    else
      # Still syncing, no state change, try again in $interval seconds
      continue
    fi
  else
    if /path/to/dropbox.py status | grep -q 'Up to date'; then
      # No updates happening, no state change
      continue
    else
      dirty=true
    fi
  fi

done

我没有对此进行过明显的测试,但也许您可以根据自己的需要进行调整。请注意,较短的间隔意味着脚本将更准确地检测更改,更长的意味着它可能会错过它们。即使间隔为1秒,我也希望Dropbox客户端可以在1秒内启动并完成更改,因此您可能会错过任何内容。

如果您知道检测触发器的方法,请在此处发布您的代码,然后您会发现一大群人乐意帮助您完成工作。没有代码可以调试的问题是..好吧,实际上是偏离主题的! :)

答案 1 :(得分:1)

使用 inotify 系统。有一个命令行工具inotifywait和一个python库。您可以收到有关正在创建,读取,写入后关闭等文件的通知

答案 2 :(得分:0)

结帐fswatch。我以前用它来做类似的事情。这是我用过的程序的一行。

fswatch --print0 -e '/\.' $dir | xargs -0 -n1 ./client.py