Secara terus-menerus mendeteksi file baru dengan alat yang tidak sah dalam beberapa direktori secara rekursif

17

Saya baru saja menginstal inotify-tools. Saya ingin terus mendeteksi file baru dengan notify-tools dalam beberapa direktori secara rekursif, dan mengirim email menggunakan postfix. Saya mungkin dapat menangani pengiriman email menggunakan bagian postfix. Saya hanya mencoba mencari cara terbaik untuk melakukan ini ketika mencoba mendeteksi file baru. Karena terkadang beberapa file ditambahkan sekaligus.

David Custer
sumber

Jawaban:

39

inotifywait (bagian dari inotify-tools ) adalah alat yang tepat untuk mencapai tujuan Anda, tidak masalah bahwa beberapa file sedang dibuat pada saat yang sama, itu akan mendeteksi mereka.

Berikut skrip contoh:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done

inotifywait akan menggunakan opsi ini.

-m untuk memantau dir tanpa batas, jika Anda tidak menggunakan opsi ini, setelah ia mendeteksi file baru, skrip akan berakhir.

-r akan memonitor file secara rekursif (jika ada banyak direktori / file, mungkin perlu beberapa saat untuk mendeteksi file yang baru dibuat)

-e create adalah opsi untuk menentukan acara yang akan dipantau dan dalam kasus Anda harus dibuat untuk menjaga file baru

--format '% w% f' akan mencetak file dalam format /complete/path/file.name

"$ {MONITORDIR}" adalah variabel yang berisi path untuk memonitor yang telah kita tentukan sebelumnya.

Jadi dalam hal file baru dibuat, inotifywait akan mendeteksi dan akan mencetak output (/complete/path/file.name) ke pipa dan sementara akan menetapkan output itu ke variabel NEWFILE .

Di dalam loop sementara Anda akan melihat cara untuk mengirim email ke alamat Anda menggunakan utilitas mailx yang akan berfungsi dengan baik dengan MTA lokal Anda (dalam kasus Anda, Postfix).

Jika Anda ingin memantau beberapa direktori, inotifywait tidak mengizinkannya tetapi Anda memiliki dua opsi, buat skrip untuk setiap dir untuk memantau atau membuat fungsi di dalam skrip, kira-kira seperti ini:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &
sahsanu
sumber
Saya lupa menambahkan beberapa penjelasan mengenai perintah yang digunakan dalam skrip sampel, itulah alasan untuk mengedit jawaban saya ... Saya juga menambahkan skrip jika op ingin memantau beberapa dir. Mengenai alat menunggu inotify, tidak mungkin untuk menjawab pertanyaan tanpa menyebutkannya karena op menggunakan alat inotify. Ngomong-ngomong, saya seorang pemula di sini jadi saya perlu belajar banyak tentang netiket, jadi, maaf jika jawaban saya tumpang tindih dengan Anda, bukan itu yang saya inginkan. Saya hanya ingin memberikan jawaban lengkap untuk op. Sekali lagi, maaf.
sahsanu
Tidak masalah dan selamat datang di SU. Mempelajari netiket biasanya dilakukan dengan cara yang sulit, karena tidak benar-benar didefinisikan di mana pun.
harrymc
4
@ Shahsanu Saya tidak setuju tentang hal "netiket" keseluruhan. Setiap orang menjawab pertanyaan dari sudut pandang masing-masing. Tidak ada tumpang tindih antara jawaban, juga tidak ada jawaban yang telah ditulis ulang. Tidak mungkin jawaban berbeda dengan cara itu ketika pertanyaannya sangat spesifik. Terima kasih banyak telah meluangkan waktu untuk menjawab pertanyaan dengan sangat rinci. Ini telah membantu lebih dari yang Anda tahu, untuk seseorang seperti saya yang baru belajar tentang semua ini. Anda telah menyelamatkan saya berjam-jam.
David Custer
1
@harrymc Netiquetta didefinisikan di sini.
David Custer
Netiket dalam lingkungan yang berkembang tidak dapat sepenuhnya ditentukan. Sudah menjadi kebiasaan di situs ini untuk tidak menduplikasi jawaban kecuali jika ditulis dengan buruk, dan bahkan kemudian didorong untuk memperbaikinya bukan melalui pengeditan. Itu selalu hak Anda dalam komunitas demokratis untuk tidak setuju. @sahsanu bisa menghindari komentar saya dengan merujuk pada jawaban saya sebelumnya sambil menunjukkan skripnya, yang akan mendapatkan persetujuan Anda dalam hal apa pun. Itulah yang akan saya lakukan di tempatnya dan itulah netiket saya, yang saya yakin saya bagikan dengan orang lain (tetapi tidak dengan semua orang, tentu saja).
harrymc
8

Gunakan inotifywait , misalnya:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

Untuk informasi dan contoh lebih lanjut, lihat artikel
Cara menggunakan inotify-tools untuk memicu skrip pada peristiwa sistem file .

harrymc
sumber
1
Jika ada yang menggunakan ini dan mengonversi variabel dari baca dalam huruf besar, Anda tidak akan dapat menjalankan beberapa perintah di dalam while. Ini karena Anda akan menimpa variabel $ PATH.
Savageman
2
@Savageman Menggunakan nama variabel huruf besar untuk variabel Anda sendiri sangat tidak disarankan karena alasan ini. Nama variabel huruf besar dicadangkan untuk penggunaan sistem; variabel Anda sendiri harus menggunakan huruf kecil.
tripleee
@ tripleee Terima kasih atas informasinya, tidak akan menggunakan huruf besar lagi :)
Savageman
0

Untuk beberapa direktori Anda dapat melakukan ini:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "[email protected]"
  done
          }


monitor &

Berikut adalah contoh daftar folder dalam file tersebut /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Konstantin Frank
sumber