我想“手动”强制 dropbox 在特定时间同步(例如,使用 cron 定期、每天间隔,作为较大备份脚本的一部分)。我的目标是仅在我控制的时间用单个“同步”命令调用替换保管箱守护程序。
查看dropboxUbuntu上命令的文档,我只看到了一种启动/停止守护进程的方法,但没有强制它同步。
是否有可以实现此目的的较低级别的 api?
根据@Rat2000的建议,我这样做了。在一个终端中,
while true; do dropbox status; sleep 1; done;
Run Code Online (Sandbox Code Playgroud)
在另一个终端中:
touch ~/Dropbox/test
Run Code Online (Sandbox Code Playgroud)
第一个终端显示大约以下输出:
Idle
Idle
Idle
...
...
Updating (1 file)
Indexing 1 file...
Updating (1 file)
Indexing 1 file...
...
...
Downloading file list...
Downloading file list...
...
...
Idle
Idle
Run Code Online (Sandbox Code Playgroud)
因此,我们可以定义一个脚本,使用expect,在受控时间执行一次性 Dropbox 同步,假设守护进程在完成同步之前不会报告“空闲”。
编辑:
这个解决方案似乎对我有用:
#!/usr/bin/python
import subprocess, time, re
print "Starting dropbox daemon"
print subprocess.check_output(['dropbox', 'start'])
started_sync = False
conseq_idle = 20
while True:
status = subprocess.check_output(['dropbox', 'status'])
print status
if re.search("Updating|Indexing|Downloading", status):
started_sync = True
conseq_idle = 20
elif re.search("Idle", status):
conseq_idle-=1
if not conseq_idle:
if started_sync:
print "Daemon reports idle consecutively after having synced. Stopping"
time.sleep(5)
else:
print "Daemon seems to have nothing to do. Exiting"
subprocess.call(['dropbox', 'stop'])
break
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
注意事项:
根据您的 Dropbox 版本,您可能需要更换
elif re.search("Idle", status):
Run Code Online (Sandbox Code Playgroud)
和
elif re.search("Up to date", status):
Run Code Online (Sandbox Code Playgroud)为了减少对系统性能的影响,您可以尝试使用Nice、ionice和nocache等实用程序,例如:
print subprocess.check_output(['nice', '-n10', 'ionice', '-c3', 'nocache', 'dropbox', 'start'])
Run Code Online (Sandbox Code Playgroud)设置脚本anacron
当然,我安排这个脚本通过 anacron 运行,如下所示:
1 10 dropbox_do_sync su myuser -p -c "python /home/myuser/scripts/dropbox_do_sync.py" >> /home/myuser/logs/anacron/dropbox_do_sync
Run Code Online (Sandbox Code Playgroud)