Synchronisieren Sie Dropbox programmgesteuert, ohne dass ein Daemon ausgeführt wird

7

Ich möchte die manuelle Synchronisierung von Dropbox zu bestimmten Zeiten erzwingen (z. B. in regelmäßigen, täglichen Intervallen mit cron als Teil eines größeren Sicherungsskripts). Mein Ziel ist es, den Dropbox-Daemon nur zu den von mir kontrollierten Zeiten durch einzelne "Sync" -Befehlsaufrufe zu ersetzen.

In der Dokumentation zum dropboxBefehl unter Ubuntu sehe ich nur eine Möglichkeit, den Dämon zu starten / zu stoppen, ihn aber nicht zur Synchronisierung zu zwingen.

Gibt es eine niedrigere API, die dies erreichen kann?

Erjoalgo
quelle
1
Ich denke, sobald der Daemon startet, erfolgt die Synchronisierung automatisch. Da bin ich mir nicht sicher.
Mihai
Vielleicht kann ich den Dämon starten, seinen Status regelmäßig überprüfen und ihn beenden, sobald er meldet, dass die Synchronisierung abgeschlossen ist?
Erjoalgo

Antworten:

4

Mit dem Vorschlag von @ Rat2000 habe ich dies getan. In einem Terminal,

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

In einem anderen Terminal:

touch ~/Dropbox/test

Das erste Terminal zeigt ungefähr die folgende Ausgabe:

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

Wir können also ein Skript definieren, mit dem expectzu kontrollierten Zeiten eine einmalige Dropbox-Synchronisierung durchgeführt wird, vorausgesetzt, der Dameon meldet "Leerlauf" erst, wenn die Synchronisierung abgeschlossen ist.


Bearbeiten:

Diese Lösung scheint für mich zu funktionieren:

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

Anmerkungen :

  • Abhängig von Ihrer Dropbox-Version müssen Sie diese möglicherweise ersetzen

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

    mit

    elif re.search("Up to date", status):
    
  • Um die Auswirkungen auf die Systemleistung zu verringern, können Sie mit Dienstprogrammen wie nice , ionice und nocache experimentieren , z.

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

Einrichten des Skripts mit anacron

Natürlich plane ich, dass dieses Skript wie folgt über Anacron ausgeführt wird:

1 10  dropbox_do_sync  su myuser -p -c "python /home/myuser/scripts/dropbox_do_sync.py" >> /home/myuser/logs/anacron/dropbox_do_sync
Erjoalgo
quelle
Wenn es funktioniert hat, markieren Sie bitte Ihre Antwort als Lösung.
Mihai
Sobald ich das Skript tatsächlich schreibe und überprüfe, ob es funktioniert, werde ich es tun. Danke für deine Idee.
Erjoalgo
Neuere Dropbox-Versionen scheinen "Aktuell" anstelle von "Leerlauf" zu melden. Möglicherweise müssen Sie dies in Ihrem Skript ändern, wenn Sie eine aktualisierte Version verwenden.
Glutanimate
3

Hier ist ein sehr einfacher Weg, um dies zu erreichen:

Ich habe eine langsame Internetverbindung und möchte nicht, dass Dropbox tagsüber läuft, wenn ich arbeite, sondern dass es die ganze Nacht läuft, wenn ich schlafen soll.

Ich habe einen Cron-Job wie diesen eingerichtet:

An einem Terminal Typ crontab -e

Fügen Sie diese Zeilen hinzu:

#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
Verrückt
quelle
Wenn Sie schlafen, ist es nicht sinnvoll, die Dropbox die ganze Nacht laufen zu lassen. Es wird eine erste Synchronisierung durchgeführt und bleibt dann für den Rest der Zeit inaktiv. Das Skript, das ich oben geschrieben habe und das Dropbox startet, wartet, bis es nach der Synchronisierung inaktiv wird, und fährt es dann herunter. Es soll einmal pro Tag über anacron ausgeführt werden. Wir haben also einen ähnlichen Ansatz, außer dass es nicht wirklich sinnvoll ist, Dropbox am Leben zu erhalten, wenn sich der zu synchronisierende Inhalt nicht ändern soll.
Erjoalgo
1

Mit user84207 und Loony Antworten:

  • Erstellen Sie 2 Skripte:

startDropbox.sh:

dropbox start

stopDropbox.sh:

result=$(dropbox status)
if [ "$result" = "Up to date" ];
then
   dropbox stop
fi
  • Fügen Sie in crontab, mit crontab -e hinzu

# startet erst nach jeweils 5 Minuten
* / 5 * * * * startDropbox.sh
# versuche jede Minute anzuhalten
* / 1 * * * * stopDropbox.sh

Topera
quelle