cronを使ってrsyncで自動バックアップし、成否をgnomeの通知で表示

2011/2/16 update

http://d.hatena.ne.jp/sr10/20110216/1297856718

ハマったとこ
  1. cronは環境変数がほとんどないため、zenityを使ってgnomeの通知を出すには、環境変数DISPLAY,LANGの設定が要る
  2. zenityの通知を使うには、--listenオプションを使い、標準入力から"message: **"の形で送る
  3. 多分shだと標準入出力のごにょごにょができないため、crontabでSHELLをbashに設定する
  4. sleepしてzenityをすぐに閉じないようにしないと、通知を表示する前に終了しちゃう感じ
ついでの機能
  1. バックアップするフォルダのサイズが1MB以下だったら大事をとってバックアップしない

r.sh

#!/bin/bash

fromdir="$HOME/Dropbox/"        # must end with "/"
todir="$HOME/bu/dropbox/"
logfile="$HOME/tb/cronrsynclog"

export DISPLAY=:0.0
export LANG=ja_JP.UTF-8

size_fromdir=$(du -s "$fromdir" | awk '{print $1}')
returncode=0

exec 10> >(zenity --notification --listen --window-icon "/usr/share/pixmaps/gnome-set-time.png")
echo "visible: false" >&10

{ echo -en "\nCRON run at "; date; } >>$logfile

if [ "$size_fromdir" -lt 1000 ]; then  # size is less than 1MB
    message="Size of $fromdir is less than 1MB so did not execute rsync in case files are unexpectedly lost."
    echo "$message" >>$logfile
    echo "message: $message">&10
    returncode=1
else
    rsync -avh --stats --delete $fromdir $todir >>$logfile
    
    if [ $? -eq 0 ]; then
        echo "message: rsync $fromdir > $todir: Done successfully." >&10
#    znotify.sh "rsync $fromdir > $todir: done successfully."
    else
        echo "message: rsync: Something wrong happened!" >&10
#    znotify.sh "rsync: something gone wrong!"
    fi
fi
sleep 1
exec 10>&-
exit $returncode

crontab -l はこんな感じ

SHELL="/bin/bash"
HOME="/home/***"
MAILTO=""
# m h  dom mon dow   command
0 * * * * /home/***/bin/r.sh