Usando a sugestão do @Rat2000, eu fiz isso. Em um terminal,
while true; do dropbox status; sleep 1; done;
Em outro terminal:
touch ~/Dropbox/test
O primeiro terminal mostra aproximadamente a seguinte saída:
Idle
Idle
Idle
...
...
Updating (1 file)
Indexing 1 file...
Updating (1 file)
Indexing 1 file...
...
...
Downloading file list...
Downloading file list...
...
...
Idle
Idle
Assim, podemos definir um script, usando expect
, para fazer uma sincronização única de dropbox em tempos controlados, assumindo que o dameon não reporta "Idle" até terminar a sincronização.
Editar:
Esta solução parece funcionar para mim:
#!/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)
Notas :
-
Dependendo da versão do seu Dropbox, talvez seja necessário substituir
elif re.search("Idle", status):
com
elif re.search("Up to date", status):
-
Para reduzir o impacto no desempenho do sistema, você pode experimentar utilitários como bom , ionice , e nocache , por exemplo:
print subprocess.check_output(['nice', '-n10', 'ionice', '-c3', 'nocache', 'dropbox', 'start'])
Definindo o script com anacron
Claro, eu programo esse script para rodar via anacron, assim:
1 10 dropbox_do_sync su myuser -p -c "python /home/myuser/scripts/dropbox_do_sync.py" >> /home/myuser/logs/anacron/dropbox_do_sync