Bagaimana saya dapat memeriksa apakah rsync membuat perubahan pada bash?

12

Saya memiliki skrip yang menggunakan rsync untuk menyinkronkan data dalam skenario lokal - jauh. Segera setelah perintah rsync dijalankan, centang untuk melihat apakah kode kesalahan sama dengan nol atau tidak. Jika nol, perintah lebih lanjut dilakukan. Namun ini tidak memperhitungkan fakta bahwa rsync mungkin telah berjalan dengan sukses tetapi tidak benar-benar membuat perubahan. Karena ini kondisi nol sama akan berjalan terlepas, yang sedikit berlebihan.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Apa yang akan menjadi pendekatan terbaik untuk memperluas ini untuk memeriksa apakah sebenarnya ada perubahan berdasarkan perintah rsync yang berjalan. Saya telah membaca bahwa flag -i dapat memberikan output ke stdout, tetapi bagaimana ini bisa ditempatkan di blok bersyarat?

James White
sumber
Anda sudah masuk -vke sana, sehingga sudah menyediakan informasi yang Anda butuhkan untuk stdout ... misalnya, daftar file yang sebenarnya dikirim. Jika tidak ada yang berubah, itu baru saja ./.
goldilocks
Ah! Bagaimana jika saya mengambil -v dan menggunakan -i dan kemudian menggunakan cek string yang tidak kosong pada perintah rsync?
James White
Sepertinya Anda menemukan solusinya sendiri? :-)
Bjorn Munch
2
Anda dapat menggunakan a=$("rsync command"). Ini akan menjalankan rsyncperintah dan menyimpan stdoutdi a. Kemudian Anda dapat menjalankan tes padaa
nitishch
1
Anda juga bisa menambahkan | grep /atau sesuatu seperti itu, lalu periksa status keluar dari grep $?, itu harus 1 jika tidak ada output.
Bjorn Munch

Jawaban:

9

Berdasarkan komentar pada pertanyaan awal saya, buat output rsync untuk stdout dengan flag -i dan gunakan kondisi pemeriksaan non-string untuk melihat apakah ada yang benar-benar berubah dalam pemeriksaan kode kesalahan. Membungkus perintah rsync dalam sebuah variabel memungkinkan pemeriksaan dilakukan.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Potensi downside, Anda harus kehilangan output verbose, tetapi Anda selalu dapat mencatatnya sebagai file.

James White
sumber
1

Saya menginginkan solusi yang lebih ketat. Saya tidak ingin menerima Number of created files:(pesannya bisa dalam bahasa lain) atau menghapus semua baris tetapi dua di -voutput (siapa yang tahu ringkasan apa yang rsyncakan dicetak dalam versi berikutnya?).

Saya menemukan bahwa Anda dapat mengatur format rsynclog, tetapi bukan format stdout-nya (lihat man rsyncd.conf).

Misalnya, tambahkan "File berubah!" ke setiap baris dengan file yang benar-benar berubah, dan kemudian grepuntuk itu:

rsync -a \
    --log-file=/tmp/rsync.log \
    --log-file-format="File changed! %f %i" \
    source-dir target-dir

if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
    echo "rsync did something!"
fi
Victor Sergienko
sumber