To jest bardziej ogólne pytanie dotyczące rekodowania „chmodowania”.
Mam ten skrypt, który w pewnym momencie musi rekurencyjnie zmieniać uprawnienia w folderze zawierającym kilkaset tysięcy plików. W tym folderze są dodawane nowe pliki każdego dnia, ale te, które już tam są, mają już ustawione uprawnienia i nie ulegają zmianie.
Moje pytanie brzmi ... kiedy dzwonię
chmod 775. -R
czy próbuje ustawić uprawnienia dla plików, które mają już ustawione odpowiednie uprawnienia, czy tylko dla nowych plików, które nie mają odpowiednich uprawnień?
Wydaje się, że przekroczenie tej komendy w skrypcie zawsze zajmuje całe wieki, mimo że „nowe” pliki to tylko kilka tysięcy i powinno to zrobić dość szybko.
Przeglądałem stronę podręcznika dla chmod, ale wydaje się, że nie wspomina nic w tej sprawie.
Jeśli chmod nie sprawdzi wcześniej uprawnień, czy powinienem zacząć szukać połączenia „find” z „chmod”?
źródło
Odpowiedzi:
chmod
może, ale nie musi, zmienić uprawnienia do plików, które są już ustawione na żądane, ale jeśli nie, nadal będzie musiał je sprawdzić, aby zobaczyć, jakie są ich bieżące uprawnienia [0]. Przy setkach tysięcy plików nie sądzę, by miało to jakiekolwiek znaczenie; czas najprawdopodobniej spędzają narzędzia wstat
każdym pliku.Możesz spróbować użyć
find
do sprawdzenia plików nowszych niż ostatnie uruchomienie lub plików, które należychmod
uruchomić, ale nie sądzę, że uzyskasz znaczną poprawę prędkości.Jeśli jest to możliwe dla skryptu, możesz najpierw umieścić nowe pliki w osobnym katalogu, jako obszar „trzymania”. Następnie możesz
chmod
TEGO katalogu (który ma tylko nowe pliki), amv
wraz z resztą. Powinno to być znacznie szybsze, ale niestety nie będzie działać dla każdej aplikacji.[0] Nawet jeśli spróbuje ustawić uprawnienia dla plików, które nie wymagają żadnych zmian, bazowy system plików prawdopodobnie nie zrobi nic z żądaniem, ponieważ jest to niepotrzebne.
źródło
optymalizacja find / chmod
Zarówno
find
ichmod
muszę przeczytaćPrawdopodobnie poprawiasz wydajność, najpierw czytając wszystkie wpisy, a następnie wszystkie i-węzły (na obracającym się dysku), ponieważ wtedy głowica dysku nie przemieszcza się między katalogiem a i-węzłami). Jak
chmod
to jest głupie (jak wyjaśnia jedna z pozostałych odpowiedzi), należy je wywoływaćfind
tylko poprzez . Ale nawet wtedy może pomóc odczytać wszystkie i-węzły przed pierwszym zapisaniem (zakładając, że masz wystarczającą ilość wolnej pamięci RAM na pamięć podręczną dysku). Sugeruję to:Dobre rozwiązanie: listy ACL
Dobre rozwiązanie może być zupełnie inne: jeśli pliki są tworzone w tym katalogu (i nie są przenoszone gdzie indziej), listy ACL mogą wykonywać zadanie w locie. Musisz tylko ustawić domyślne listy ACL w katalogu nadrzędnym.
Dalszą poprawę można osiągnąć dzięki optymalizacji systemu plików. Jeśli jest to ext3 / ext4, możesz
e2fsck -D
od czasu do czasu uruchamiać . Może pomaga umieścić ten katalog w osobnym woluminie. Możesz wypróbować różne systemy plików lub ustawienia systemu plików (np. Różne rozmiary i-węzłów).źródło
find
Rozwiązanie o podwojeniu mój czas,chmod
ing wewnątrz kontenera Döcker.Zakładając, że korzystanie
chmod
z pakietu GNU coreutils na Ubuntu 12.10.chmod 775 . -R
wykonujefchmodat
wywołanie systemowe dla każdego znalezionego pliku, niezależnie od tego, czy uprawnienia wymagają zmiany, czy nie. Potwierdziłem to zarówno poprzez sprawdzenie kodu, jak i użyciestrace chmod 775 . -R
(fragmentu poniżej) do wyświetlenia faktycznego zachowania.Uruchomienie
fchmodat
każdego pliku ma kilka wadfind
/xargs
/chmod
Metoda wspomniano przez innych będzie prawdopodobnie szybciej przez zmianę tylko pliki, które trzeba wymieniać.fchmodat
zmiany modyfikacji statusu pliku (ctime) każdego pliku. Spowoduje to, że każdy plik / i-węzeł zmieni się za każdym razem i prawdopodobnie spowoduje nadmierne zapisy na dysku. Może być możliwe użycie opcji montowania, aby zatrzymać nadmiar zapisu.Prosty eksperyment pokazuje zmiany czasu dla prostej
chmod
Ale to się nie zmienia przez
find
/xargs
/chmod
kilka minut późniejZawsze miałbym tendencję do używania wersji
find
/xargs
/,chmod
ponieważ find daje większą kontrolę nad wyborem rzeczy.źródło
[Źródło] (1) pokazuje, że
chmod(1)
zawsze próbuje ustawić tryb, a następnie sprawdza ponownie za pomocą [fstatat (2)] (2).Pliki są przetwarzane za pomocą [fts (3)] (3), który musi wcześniej „stat” wszystkich przemierzonych obiektów systemu plików, aby zbudować swoje drzewo danych.
Unixlore zawiera [fajny artykuł] (4), w którym mierzy się
chmod(1)
czas z podejściemfind
/xargs
podejście: ta ostatnia wygrywa pod względem wielkości.Oto linia poleceń dostosowana do pierwotnego pytania:
Dwa powody:
Przejście systemu plików jest oddzielone od operacji na plikach poprzez potok między dwoma procesami, który może nawet działać na różnych rdzeniach.
fts(3)
operacja jest zminimalizowana, ponieważxargs(1)
„spłaszcza” drzewo katalogów.Więc tak: zdecydowanie powinieneś użyć
find
/xargs
. dla prostego rozwiązania.Inne opcje:
Graj z [umask] (5) i kodem źródłowym procesu (procesów) pisania nowych plików.
Jeśli używasz Linuksa, istnieje prawdopodobieństwo, że Twój system włączył
inotify
podsystem jądra. W takim przypadku możesz napisać skuteczne rozwiązanie za pomocą [inotifywait (1)] (6).Sidenote: chyba że chcesz wykonać uprawnienia do plików, sugeruję zmodyfikować wywołanie w następujący sposób:
Uwaga dla redaktorów: Nie wolno mi dodawać więcej niż dwóch linków do postu, ani komentować innych postów. Zostawiam adresy URL tutaj i mam nadzieję, że jakiś otwarty użytkownik o wystarczającej reputacji ponownie umieści je w tekście i usunie ten akapit.
Komentarz na temat przygotowania pamięci podręcznej dysku za pomocą
find . -printf ""
:Może to przyspieszyć wykonanie następujących
chmod
operacji, jednak zależy to od dostępnej pamięci i obciążenia we / wy. Więc to może działać, czy nie. Oddzielenie traversal (find
) ichmod
operacji już zapewnia buforowanie, więc uruchomienie pamięci podręcznej może być zbędne.źródło
Czy zastanawiałeś się nad zmianą procesów tworzących plik, aby były tworzone w trybie 0775? Spójrz na wartość umask w środowisku - 0002 może pomóc.
źródło