Programaticamente sincronizar o dropbox sem executar o daemon

6

Eu gostaria de 'manualmente' forçar o dropbox a sincronizar em determinados momentos (por exemplo, em intervalos regulares diários usando o cron, como parte de um script de backup maior). Meu objetivo é substituir o daemon da caixa de depósito por chamadas de comando "sync" únicas apenas nos horários que eu controle.

Olhando a documentação do comando dropbox no Ubuntu, vejo apenas uma maneira de iniciar / parar o daemon, mas não de forçá-lo a sincronizar.

Existe uma API de nível mais baixo disponível que pode conseguir isso?

    
por erjoalgo 25.09.2013 / 12:49

3 respostas

4

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
    
por erjoalgo 25.09.2013 / 13:38
3

Aqui está uma maneira muito simplista de fazer isso:

Eu tenho uma conexão lenta com a Internet e não quero que o Dropbox esteja funcionando durante o dia, quando estou trabalhando, mas quero que ele aconteça a noite toda quando eu estiver dormindo.

Eu configurei um cron job assim:

Em um tipo de terminal, crontab -e

Adicione estas linhas:

#This line will stop Dropbox at 7 AM every morning:
 * 7 * * * dropbox stop
#This line will start dropbox at 10 PM every evening:
 * 22 * * * dropbox start
    
por Loony 12.11.2013 / 14:49
1

Usando user84207 e Loony respostas:

  • Crie dois scripts:

startDropbox.sh:

dropbox start

stopDropbox.sh:

result=$(dropbox status)
if [ "$result" = "Up to date" ];
then
   dropbox stop
fi
  • Adicionar no crontab, com crontab -e
  

# começa somente a cada 5 minutos
  * / 5 * * * * startDropbox.sh
  # tente parar a cada minuto
  * / 1 * * * * stopDropbox.sh

    
por Topera 19.02.2015 / 18:14