Ini adalah pertanyaan yang lebih umum tentang 'chmoding' secara rekursif.
Saya memiliki skrip ini yang pada beberapa titik perlu mengubah izin secara rekursif dalam folder yang memiliki beberapa ratus ribu file. Ada file baru yang ditambahkan di folder itu setiap hari, tetapi yang sudah ada memiliki izin yang sudah ditetapkan dan tidak berubah.
Pertanyaan saya adalah ... ketika saya menelepon
chmod 775. -R
apakah itu mencoba mengatur izin untuk file yang sudah memiliki hak akses ditetapkan, atau hanya untuk file baru yang tidak memiliki izin yang tepat?
Tampaknya selalu butuh waktu lama untuk melewati perintah ini dalam skrip, meskipun file 'baru' hanya beberapa ribu dan harus melakukan izinnya dengan cukup cepat.
Saya telah melihat halaman manual untuk chmod, tetapi sepertinya tidak menyebutkan apa-apa tentang kasus ini.
Jika chmod tidak memeriksa izin sebelumnya, haruskah saya mulai mencari menggabungkan 'temukan' dengan 'chmod'?
sumber
Jawaban:
chmod
mungkin atau mungkin tidak mengubah izin file yang sudah diatur ke apa yang Anda inginkan, tetapi jika tidak, masih perlu memeriksa mereka untuk melihat apa izin mereka saat ini [0]. Dengan ratusan ribu file, saya pikir itu tidak masalah; waktu kemungkinan besar dihabiskan oleh alat-alat distat
setiap file.Anda dapat mencoba menggunakan
find
untuk memeriksa file yang lebih baru daripada yang terakhir dijalankan atau file yang perluchmod
dijalankan, tapi saya rasa Anda tidak akan mendapatkan banyak peningkatan kecepatan.Jika memungkinkan untuk skrip Anda, Anda mungkin bisa memasukkan file baru ke direktori terpisah terlebih dahulu, sebagai area "holding". Maka kamu bisa
chmod
direktori ITU (yang hanya memiliki file baru), danmv
mereka dengan sisanya. Itu seharusnya jauh lebih cepat, tetapi sayangnya tidak akan bekerja untuk setiap aplikasi.[0] Bahkan jika ia mencoba untuk mengatur izin file yang tidak memerlukan perubahan, sistem file yang mendasarinya mungkin tidak akan melakukan apa pun dengan permintaan, karena itu tidak perlu.
sumber
temukan / optimisasi chmod
Keduanya
find
danchmod
harus membacaAnda mungkin mendapatkan peningkatan kinerja dengan terlebih dahulu membaca semua entri dan kemudian semua inode (pada disk yang berputar) karena kepala disk tidak bergerak antara direktori dan inode). Seperti
chmod
adalah bodoh (sebagai salah satu jawaban yang lain menjelaskan) itu harus disebut melaluifind
saja. Tetapi meskipun demikian mungkin akan membantu untuk membaca semua inode sebelum yang pertama ditulis (dengan asumsi Anda memiliki cukup RAM gratis untuk cache disk). Saya menyarankan ini:Solusi yang bagus: ACL
Solusi yang baik mungkin sangat berbeda: Jika file dibuat dalam direktori ini (dan tidak dipindahkan dari tempat lain) maka ACL dapat melakukan pekerjaan dengan cepat. Anda hanya perlu mengatur ACL default pada direktori induk.
Peningkatan lebih lanjut dapat dicapai dengan optimisasi sistem file. Jika ext3 / ext4 maka Anda dapat menjalankan
e2fsck -D
dari waktu ke waktu. Mungkin ada baiknya menempatkan direktori ini ke volume yang terpisah. Anda dapat mencoba berbagai sistem file atau pengaturan sistem file (mis. Ukuran inode yang berbeda).sumber
find
solusi tentang dua kali lipat waktu saya,chmod
ing dalam sebuah wadah buruh pelabuhan.Dengan asumsi penggunaan
chmod
dari GNU coreutils paket pada Ubuntu 12.10.chmod 775 . -R
mengeksekusifchmodat
panggilan sistem untuk setiap file yang ditemukan terlepas dari apakah izin perlu diubah atau tidak. Saya mengkonfirmasi ini dengan memeriksa kode dan menggunakanstrace chmod 775 . -R
(snippet di bawah) untuk membuat daftar perilaku yang sebenarnya.Ada beberapa kelemahan berjalan
fchmodat
di setiap filefind
/xargs
/chmod
yang disebutkan oleh orang lain kemungkinan akan lebih cepat dengan hanya mengubah file yang perlu diubah.fchmodat
mengubah modifikasi status file (waktu) dari setiap file. Ini akan menyebabkan setiap file / inode berubah setiap waktu dan kemungkinan akan menyebabkan kelebihan penulisan disk. Dimungkinkan untuk menggunakan opsi mount untuk menghentikan kelebihan penulisan ini.Eksperimen sederhana menunjukkan perubahan waktu yang terjadi secara langsung
chmod
Tetapi ini tidak berubah untuk
find
/xargs
/chmod
beberapa menit kemudianSaya akan selalu cenderung menggunakan versi
find
/xargs
/chmod
karena find memberi lebih banyak kontrol untuk memilih sesuatu.sumber
[Sumber] (1) menunjukkan, yang
chmod(1)
selalu mencoba mengatur mode dan kemudian memeriksa kembali dengan [fstatat (2)] (2).File diproses melalui [fts (3)] (3), yang harus 'stat' semua objek sistem file yang dilalui sebelumnya untuk membangun pohon datanya.
Unixlore memiliki [artikel yang bagus] (4) di mana
chmod(1)
waktunya melawanfind
/xargs
pendekatan: yang terakhir menang dengan besar.Di sini baris perintah disesuaikan dengan pertanyaan awal:
Dua alasan:
Traversal sistem file dipisahkan dari operasi pada file melalui pipa antara dua proses, yang bahkan mungkin berjalan pada core yang berbeda.
fts(3)
operasi diminimalkan, karenaxargs(1)
'meratakan' pohon direktori.Jadi ya: Anda harus menggunakan
find
/xargs
. untuk solusi sederhana.Pilihan lain:
Mainkan dengan [umask] (5) dan kode sumber dari proses menulis file baru.
Jika Anda menggunakan Linux, kemungkinan sistem Anda telah mengaktifkan
inotify
subsistem kernel. Dalam hal ini, Anda dapat membuat skrip solusi yang efisien melalui [inotifywait (1)] (6).Sidenote: kecuali jika Anda ingin mengeksekusi izin pada file Anda, saya sarankan untuk memodifikasi doa sebagai berikut:
Catatan untuk editor: Saya tidak diizinkan untuk menambahkan lebih dari dua tautan ke posting, tidak juga untuk mengomentari posting lain. Saya meninggalkan url di sini dan berharap beberapa pengguna berhati terbuka dengan reputasi yang cukup menempatkan mereka kembali ke teks dan menghapus paragraf ini.
Mengomentari priming cache disk dengan
find . -printf ""
:Ini mungkin mempercepat pelaksanaan
chmod
operasi berikut , namun tergantung pada memori yang tersedia dan beban i / o. Jadi mungkin berhasil, atau tidak. Decoupling traversal (find
) danchmod
operasi sudah menyediakan caching, jadi priming cache mungkin berlebihan.sumber
Sudahkah Anda mempertimbangkan untuk mengubah proses yang membuat file agar dibuat dengan mode 0775? Lihatlah nilai umask di lingkungan - 0002 dapat membantu.
sumber