Saya ingin menjalankan skrip secara otomatis setiap kali file baru disalin ke direktori tertentu. Dengan kata lain, apakah ada cara di Linux untuk "menonton" direktori untuk perubahan dan kemudian menjalankan sesuatu sebagai respons terhadap perubahan?
17
Jawaban:
Jika Anda cukup beruntung berada di distribusi berbasis debian
apt-get install dnotify
,. Distribusi lain mungkin memiliki sesuatu yang mirip - caridnotify
namanya.Jika Anda ingin menangani ini di dalam program Anda sendiri, dnotify juga merupakan API yang ingin Anda gunakan.
sumber
emerge inotify-tools
Anda dapat menjalankan skrip dengan inotify-tools, seperti ini. Ini akan menonton direktori untuk perubahan dalam file yang dimodifikasi, file baru, dan file yang dihapus, kemudian akan menjalankan skrip.
sumber
incron pada dasarnya adalah apa yang Anda inginkan, saya pikir. Ini menggunakan inotify sebagai mekanisme notifikasi (yang, seperti yang orang lain tunjukkan, menggantikan notnotify), tetapi tidak memerlukan skrip yang terus berjalan, menggunakan inotifywait atau yang serupa (walaupun, jelas, daemon incron berjalan sepanjang waktu). 'Crontab' di seluruh sistem dan 'crontab' pengguna didukung dengan cara yang mirip dengan cron standar, tetapi alih-alih menentukan waktu sebagai pemicu, inotifikasi acara dan nama file / direktori yang digunakan.
incron dikemas untuk banyak distribusi, termasuk Ubuntu dan Debian, saya percaya.
sumber
Ada perangkat lunak hanya untuk tujuan ini, autoenv Anda mungkin ingin memeriksanya.
sumber
entr adalah alat pemberitahuan file paling sederhana dan paling komposable yang pernah saya lihat. Penggunaannya dioptimalkan untuk menonton file daripada direktori, tetapi juga dapat menyelesaikan kasus Anda.
Untuk mendeteksi dan bertindak pada file yang ditambahkan, gabungkan dengan alat lain seperti mis
make
.entr
tidak mengirim nama atau semacamnya, itu hanya menjalankan apa yang Anda perintahkan untuk dijalankan.Untuk memeriksa file yang ditambahkan dalam direktori:
Jika Anda juga ingin bertindak ketika file yang ada berubah:
... dan di situlah mekanisme loop berguna, karena
find
ekspresi akan berjalan lagi jika file ditambahkan.Jika Anda ingin penanganan kesalahan yang lebih baik dan ingin memastikan hal-hal hanya berjalan sekali per file yang ditambahkan / dihapus, hal-hal menjadi sedikit aneh, tetapi untuk kasus-kasus sederhana ini brilian.
EDIT: Jika Anda ingin melakukan ini pada tingkat sistem, sesuatu seperti incron , cukup tambahkan skrip ke manajer proses favorit Anda (seperti s6 , runit , systemd atau sysvinit dan lewati loop:
The
exec
dan substitusi proses (<(...)
) adalah penting ketika menjalankan dari manajer proses, untuk menangani sinyal dengan benar (yaitu untuk mendapatkan shell keluar dari jalan).sumber