web-dev-qa-db-ja.com

デーモンを実行せずにプログラムでDropboxを同期

特定の時間(たとえば、より大きなバックアップスクリプトの一部として、cronを使用して定期的に、毎日の間隔)でDropboxを「手動で」強制的に同期させたいと思います。私の目標は、ドロップボックスデーモンを、自分が制御する時間のみに単一の「同期」コマンド呼び出しで置き換えることです。

Ubuntuでdropboxコマンドのドキュメントを見ると、デーモンを開始/停止する方法しかわかりませんが、強制的に同期させることはできません。

これを達成できる低レベルのAPIはありますか?

7
erjoalgo

@ Rat2000の提案を使用して、これを行いました。 1つの端末で、

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

別のターミナルで:

touch ~/Dropbox/test

最初の端末には、およそ次の出力が表示されます。

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

だから、expectを使用して、dameonが同期が完了するまで「アイドル」を報告しないと仮定して、制御された時間に一度だけ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)

  • Dropboxのリリースによっては、交換が必要になる場合があります

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

    Elif re.search("Up to date", status):
    
  • システムパフォーマンスへの影響を減らすために、 Niceionicenocache などのユーティリティを試すことができます。例:

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

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
4
erjoalgo

これを実現する非常に単純な方法を次に示します。

インターネット接続が遅く、仕事中の日中はDropboxをまったく実行したくありませんが、眠っているはずの夜中はDropboxを実行したいです。

このようなcronジョブをセットアップしました。

端末でcrontab -eと入力します

次の行を追加します。

#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

ser84207およびLoonyの回答を使用:

  • 2つのスクリプトを作成します。

startDropbox.sh:

dropbox start

stopDropbox.sh:

result=$(dropbox status)
if [ "$result" = "Up to date" ];
then
   dropbox stop
fi
  • Crontab -eを使用して、crontabに追加します

#5分ごとにのみ開始
*/5 * * * * startDropbox.sh
#毎分停止しよう
*/1 * * * * stopDropbox.sh

1
Topera