membuat tugas cronjob menunggu pekerjaan rsync sebelumnya selesai

11

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.

kenyal
sumber
Jika pekerjaan berpotensi membutuhkan waktu lebih dari satu jam untuk diselesaikan, dan Anda menjadwalkannya lebih dekat dari durasi, maka Anda salah menjadwalkan pekerjaan. Entah bagaimana cara mengurangi waktu atau meningkatkan interval antara pekerjaan. Jika Anda terus melakukan backup jarak jauh, Anda mungkin ingin mempertimbangkan rencana pemulihan bencana baru.
vgoff

Jawaban:

11

Anda dapat menerapkan semacam penguncian. Ini akan mencetak jumlah proses rsync yang masih berjalan:

pgrep -cx rsync

Dan ini akan menjalankan rsync hanya jika tidak ada proses rsync lainnya:

pgrep -cx rsync || rsync ...

Penggunaan -xakan mencegah pencocokan nama yang tidak diinginkan secara tidak sengaja (misalnya "fooba rsync hronizator" atau "not_an_ rsync _totally" - berfungsi seperti pgrep -c ^rsync$)

mgabriel
sumber
Dalam hal ini tidak jelas. -c menghitung jumlah proses yang memiliki nama rsync. Jika ini bukan 0 maka shell menafsirkan hasilnya sebagai benar (bukan salah). The || "or lines" lihat item pertama benar dan jangan repot-repot menjalankan item kedua, rsync.
merampok
13

Anda dapat menggunakan perintah kawanan untuk membantu Anda melakukan hal ini misalnya dalam hal flock -nini mungkin yang Anda inginkan karena akan menyebabkan kegagalan langsung perintah jika tidak dapat memperoleh kunci mis.

30 * * * *  /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript 
user9517
sumber
Secara umum, nama file yang dapat diprediksi di / tmp sering berbahaya karena kondisi ras dan akses luas ke direktori / tmp. Apakah aman dalam kasus ini?
mc0e
Dalam hal ini nama yang dapat diprediksi tidak hanya aman, tetapi juga diperlukan; itulah yang membuat kunci (kata benda) mengunci (kata kerja). Dengan kata lain, keadaan kunci didasarkan secara khusus dan semata-mata pada keberadaan file dengan nama spesifik, dapat diprediksi. Jika nama file tidak dapat diprediksi, atau jika diubah secara dinamis, maka flock akan memungkinkan rsync untuk menjalankannya sendiri, mengalahkan tujuannya. Namun, Anda dapat meredakan kekhawatiran Anda, dan menjadi sedikit lebih "benar", dengan meletakkan file kunci di suatu tempat seperti /var/runsebaliknya.
Evan de la Cruz
3

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.

EdwardTeach
sumber
Saya menggunakan rdiff-backup juga. Tetapi Anda harus berhati-hati dalam pengaturan ini karena cadangan rdiff membutuhkan waktu lebih banyak untuk diselesaikan daripada rsync saja.
mgabriel
3

Inilah yang akan saya lakukan. Buat skrip pembungkus di sekitar rsync untuk membuat file kunci.

script 1
- create lock file
- rsync
- remove lock file

script 2 (running later then script 1)
- check if lock file is there
    - if not run
    - if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script
Mike
sumber
2
Pastikan juga untuk menghapus file kunci setelah reboot, jika tidak, Anda bisa berakhir dengan proses yang tidak pernah berjalan lagi.
John Gardeniers
2

Jawaban saya agak sama dengan yang dikatakan Mike.

Dalam skrip, Anda harus meletakkan sesuatu seperti ini:

  • buat file kunci
  • Periksa keberadaan file kunci saat Anda menjalankannya lain kali.

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.local

Napster_X
sumber
1

Lihatlah anacron (cron anachronistic) dengan saklar -s (bersambung). Serialize memastikan bahwa perintah tidak akan dipanggil lagi jika yang sebelumnya masih berjalan.

tu-Reinstate Monica-dor duh
sumber
Anda mungkin salah paham pertanyaannya.
John Gardeniers
Saya kira tidak. Pertanyaannya adalah "Apakah ada cara yang dijamin untuk memastikan bahwa perintah rsync tidak dimulai sebelum yang sebelumnya selesai menggunakan cronjob?" Anacron menjalankan cronjobs dengan fungsionalitas ekstra / berbeda. Serialize memastikan bahwa perintah yang Anda panggil tidak dimulai sampai yang sebelumnya selesai.
tu-Reinstate Monica-dor duh
Permintaan maaf saya. Adalah saya yang salah membaca pertanyaan.
John Gardeniers
0

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:

[ $(pgrep ping | wc -l) -eq 0 ] && ping multiplay.co.uk || echo "Sorry, ping already in progress"

Saya menggunakan ping sebagai contoh perintah.

Semoga ini membantu.

kabadisha
sumber