web-dev-qa-db-fra.com

Synchronisation par programme de la liste déroulante sans démon en cours d'exécution

J'aimerais forcer "manuellement" Dropbox à se synchroniser à certains moments (par exemple, à intervalles réguliers et quotidiens à l'aide de cron, dans le cadre d'un script de sauvegarde plus important). Mon objectif est de remplacer le démon dropbox par un seul appel de commande "sync" aux heures que je contrôle.

En regardant la documentation de la commande dropbox sur Ubuntu, je ne vois qu'un moyen de démarrer/arrêter le démon, mais pas de le forcer à se synchroniser.

Y a-t-il une api de niveau inférieur disponible qui peut accomplir cela?

7
erjoalgo

En utilisant la suggestion de @ Rat2000, je l'ai fait. Dans un terminal,

while true; do dropbox status; sleep 1; done;

Dans un autre terminal:

touch ~/Dropbox/test

Le premier terminal affiche à peu près la sortie suivante:

Idle
Idle
Idle
...
...
Updating (1 file)
Indexing 1 file...
Updating (1 file)
Indexing 1 file...
...
...
Downloading file list...
Downloading file list...
...
...
Idle
Idle

Ainsi, nous pouvons définir un script, en utilisant expect, pour effectuer une synchronisation ponctuelle à l'aide d'une boîte de dépôt à des heures contrôlées, en supposant que le dameon ne signale pas "inactif" jusqu'à ce que la synchronisation soit terminée.


Modifier:

Cette solution semble fonctionner pour moi:

#!/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)

Notes :

  • En fonction de votre version de Dropbox, vous devrez peut-être remplacer

    Elif re.search("Idle", status):
    

    avec

    Elif re.search("Up to date", status):
    
  • Pour réduire l'impact sur les performances du système, vous pouvez expérimenter avec des utilitaires tels que Nice , ionice et nocache , par exemple:

    print subprocess.check_output(['Nice', '-n10', 'ionice', '-c3', 'nocache', 'dropbox', 'start'])
    

Configuration du script avec anacron

Bien sûr, je planifie l'exécution de ce script via Anacron, comme suit:

1 10  dropbox_do_sync  su myuser -p -c "python /home/myuser/scripts/dropbox_do_sync.py" >> /home/myuser/logs/anacron/dropbox_do_sync
4
erjoalgo

Voici un moyen très simple d'accomplir ceci:

J'ai une connexion Internet lente et je ne veux pas du tout que Dropbox fonctionne toute la journée lorsque je travaille, mais le souhaite toute la nuit quand je suis censé être endormi.

J'ai créé un travail cron comme ça:

A un terminal de type crontab -e

Ajoutez ces lignes:

#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
3
Loony

Utiliser ser84207 et Loony répond:

  • Créez 2 scripts:

startDropbox.sh:

dropbox start

stopDropbox.sh:

result=$(dropbox status)
if [ "$result" = "Up to date" ];
then
   dropbox stop
fi
  • Ajouter dans crontab, avec crontab -e

# commence seulement après chaque 5 minutes
*/5 * * * * startDropbox.sh
# essayer d'arrêter chaque minute
*/1 * * * * stopDropbox.sh

1
Topera