Bagaimana menjalankan perintah ketika konten direktori diperbarui?


27

Ada direktori Ayang isinya sering diubah oleh orang lain.

Saya telah membuat direktori pribadi Btempat saya menyimpan semua file yang pernah ada A.

Saat ini, saya hanya kadang-kadang menjalankan rsyncuntuk mendapatkan file yang akan didukung dari Ake B. Namun, saya khawatir kemungkinan beberapa file akan ditambahkan A, dan kemudian dihapus dari Asebelum saya mendapatkan kesempatan untuk menyalinnya B.

Apa cara terbaik untuk mencegah hal ini terjadi? Idealnya, saya ingin agar skrip cadangan saya saat ini berjalan setiap kali isi Adiubah.

Jawaban:


29

Jika Anda telah menginstal inotify-tools Anda dapat menggunakan inotifywaituntuk memicu tindakan jika file atau direktori ditulis untuk:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Di mana -qqsaklar benar-benar diam, -rbersifat rekursif (jika perlu) dan -emerupakan acara untuk memantau, dalam hal ini modify. Dari man inotifywait:

memodifikasi
file yang ditonton atau file dalam direktori yang ditonton ditulis untuk.

5
incrondmungkin juga menarik.
Shawn J. Goff

1
Keren. Apakah saya hanya akan meletakkan skrip di atas di bashrc saya sehingga berjalan ketika saya masuk? Apakah ada cara lain untuk menjalankannya sepanjang waktu?
oadams

Untuk login, ya /etc/profileuntuk seluruh sistem atau .bash_profilehanya untuk pengguna Anda. Untuk menjalankannya setelah boot, itu tergantung pada rasa Unix / Linux Anda; /etc/rc.local, /etc/rc.d/atau/etc/init.d/
jasonwryan

1
Untuk direktori yang lebih besar, Anda mungkin ingin mempertimbangkan untuk menggunakan --monitorsaklar (dan menyalurkan output ke loop Anda sebagai gantinya), jika tidak, ada banyak overhead ketika inotifywaitdimulai berulang-ulang
Tobias Kienzler

Seberapa andal solusi ini bekerja untuk menjalankan skrip untuk setiap file yang ditambahkan dalam pohon direktori melalui server FTP (misalkan rata-rata file baru ditambahkan setiap 3 menit dan ini akan berlangsung selama bertahun-tahun)? Jika tidak, apakah ada solusi alternatif?
Nikola Novak

5

Sebenarnya, jika seseorang menjatuhkan file dan menghapusnya dengan sangat cepat, Anda mungkin melewatkannya. Penggunaan inotify (di Linux, atau fitur serupa di bawah kesatuan lainnya) membuat jendela risiko kecil.

Jika Anda dapat me-mount sistem file pilihan Anda pada direktori itu (saya menyadari ini mungkin bukan pilihan), Anda dapat menempatkan yang mencatat semua versi file, misalnya copyfs .


4

Coba entralat baris perintah yang dapat menjalankan perintah sewenang-wenang ketika file berubah. Sejak rilis 2.9, opsi arloji direktori ( -d) ditambahkan untuk bereaksi terhadap peristiwa ketika file baru ditambahkan ke direktori.

Contoh untuk menjalankan utilitas jika file baru ditambahkan ke proyek:

$ while true; do
> echo src/* | entr -d your_command
> done

Dalam mode arloji direktori, direktori induk dari setiap file secara implisit ditambahkan ke daftar arloji.

Satu-satunya implikasi dari ini adalah bahwa jika file baru muncul, ia harus keluar untuk memungkinkan loop shell eksternal untuk memindai ulang sistem file.

Berikut adalah versi tanpa opsi arloji direktori:

$ while true; do
> echo src/* src | entr your_command
> done

Ini adalah contoh sederhana tergantung pada kebutuhan Anda:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Periksa: situs web entrproject.org untuk lebih jelasnya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.