Saya menggunakan rsync untuk membuat cadangan beberapa data dari satu server ke yang lain. Semua berfungsi dengan baik, tetapi mungkin perlu waktu lebih lama untuk diselesaikan tergantung pada berapa banyak data yang ada untuk ditransfer.
Apakah ada cara yang dijamin untuk memastikan bahwa perintah rsync tidak dimulai sebelum yang sebelumnya selesai menggunakan cronjob?
Misalnya, setiap jam saya menjalankan perintah rsync, tetapi kemungkinan transfernya selesai lebih dari 1 jam, sehingga yang berikutnya akan dimulai sebelum yang sebelumnya selesai.
Jawaban:
Anda dapat menerapkan semacam penguncian. Ini akan mencetak jumlah proses rsync yang masih berjalan:
Dan ini akan menjalankan rsync hanya jika tidak ada proses rsync lainnya:
Penggunaan
-x
akan mencegah pencocokan nama yang tidak diinginkan secara tidak sengaja (misalnya "fooba rsync hronizator" atau "not_an_ rsync _totally" - berfungsi sepertipgrep -c ^rsync$
)sumber
Anda dapat menggunakan perintah kawanan untuk membantu Anda melakukan hal ini misalnya dalam hal
flock -n
ini mungkin yang Anda inginkan karena akan menyebabkan kegagalan langsung perintah jika tidak dapat memperoleh kunci mis.sumber
/var/run
sebaliknya.Jika Anda ingin mempertimbangkan alat lain, Anda juga bisa melihat rdiff-backup . Ia menggunakan librsync untuk melakukan backup, dan menyimpan sejumlah delta / peningkatan yang dapat dikonfigurasi. Itu juga mengunci sehingga hanya satu proses backup-rdiff dapat berjalan pada waktu tertentu.
sumber
Inilah yang akan saya lakukan. Buat skrip pembungkus di sekitar rsync untuk membuat file kunci.
sumber
Jawaban saya agak sama dengan yang dikatakan Mike.
Dalam skrip, Anda harus meletakkan sesuatu seperti ini:
Tetapi ada satu hal yang sangat penting yang harus Anda lakukan. dan untuk menerapkan sistem perangkap.
Jadi, dengan itu, apa yang dapat Anda lakukan, adalah bahwa meskipun skrip Anda entah bagaimana terbunuh atau seseorang membunuhnya, maka Anda dapat menjebak sinyal itu dan menghapus file kunci, sehingga Anda tidak memiliki file kunci basi.
Anda dapat membaca cara menerapkannya di sini .
Hanya satu hal kecil, Anda tidak dapat menjebak sinyal 9, maksud saya jika seseorang melakukannya
kill -9
, Anda tidak dapat menjebaknya karena sinyal itu langsung berinteraksi dengan kernel dan tidak ada cara untuk menjebaknya.Juga, seperti yang disarankan oleh John, Anda perlu menghapus file kunci setiap kali sistem dinyalakan ulang, hanya untuk memastikan bahwa tidak ada lagi file basi.
Itu bisa Anda lakukan dengan mudah dengan meletakkan
rm -f <FILE>
perintah kecil di /etc/rc.localsumber
Lihatlah anacron (cron anachronistic) dengan saklar -s (bersambung). Serialize memastikan bahwa perintah tidak akan dipanggil lagi jika yang sebelumnya masih berjalan.
sumber
Gunakan hatools ( http://www.fatalmind.com/software/hatools/ ) untuk mengunci rsync cron dalam mode tunggu.
sumber
flock(1)
Saya tidak bisa mendapatkan solusi mgabriel untuk bekerja pada OSX karena versi OSX dari pgrep tampaknya tidak memiliki opsi -c (saya berasumsi ini untuk hitungan). Sebagai gantinya saya menggunakan yang berikut:
Saya menggunakan ping sebagai contoh perintah.
Semoga ini membantu.
sumber