Dies ist eine allgemeinere Frage zum rekursiven "Chmoding".
Ich habe dieses Skript, das irgendwann die Berechtigungen in einem Ordner mit einigen hunderttausend Dateien rekursiv ändern muss. In diesem Ordner werden jeden Tag neue Dateien hinzugefügt, aber die bereits vorhandenen Dateien haben die bereits festgelegten Berechtigungen und ändern sich nicht.
Meine Frage ist ... wenn ich anrufe
chmod 775. -R
Wird versucht, die Berechtigung für die Dateien festzulegen, für die bereits die richtigen Berechtigungen festgelegt wurden, oder nur für die neuen Dateien, für die die richtigen Berechtigungen nicht festgelegt wurden?
Es scheint immer eine Ewigkeit zu dauern, bis dieser Befehl im Skript abgelaufen ist, obwohl es sich bei den "neuen" Dateien nur um einige Tausend handelt und sie ihre Berechtigungen ziemlich schnell ausführen sollten.
Ich habe in der Manpage nach chmod gesucht, aber in diesem Fall scheint nichts erwähnt zu werden.
Wenn chmod nicht vorher nach Berechtigungen sucht, sollte ich dann versuchen, 'find' mit 'chmod' zu kombinieren?
quelle
Antworten:
chmod
Möglicherweise werden die Berechtigungen von Dateien, die bereits auf die von Ihnen gewünschten Werte festgelegt sind, möglicherweise nicht geändert. Andernfalls müssen sie jedoch überprüft werden, um ihre aktuellen Berechtigungen zu ermitteln [0]. Bei Hunderttausenden von Dateien denke ich nicht, dass es in irgendeiner Weise wichtig wäre. Die Zeit wird höchstwahrscheinlich von den Tools fürstat
jede Datei aufgewendet .Sie können versuchen
find
, entweder nach Dateien zu suchen, die neuer als die letzte Ausführung sind, oder nach Dateien, die ausgeführt werden müssenchmod
, aber ich glaube nicht, dass Sie eine große Geschwindigkeitsverbesserung erzielen werden.Wenn es für Ihr Skript möglich ist, können Sie die neuen Dateien möglicherweise zuerst in einem separaten Verzeichnis als "Wartebereich" ablegen. Dann können Sie
chmod
DIESES Verzeichnis (das nur neue Dateien enthält) undmv
diese mit dem Rest verbinden. Das sollte wesentlich schneller gehen, funktioniert aber leider nicht für jede Anwendung.[0] Auch wenn versucht wird, die Berechtigung von Dateien festzulegen, die keine Änderungen benötigen, wird das zugrunde liegende Dateisystem wahrscheinlich nichts mit der Anforderung anfangen, da dies nicht erforderlich ist.
quelle
find / chmod Optimierung
Beides
find
undchmod
muss lesenSie erzielen wahrscheinlich eine Leistungsverbesserung, indem Sie zuerst alle Einträge und dann alle Inodes (auf einer sich drehenden Platte) lesen, da sich dann der Plattenkopf nicht zwischen dem Verzeichnis und den Inodes bewegt. Wie
chmod
ist dumm (als eine der anderen Antworten erklärt) sollte es durch aufgerufen werdenfind
nur. Aber selbst dann kann es hilfreich sein, alle Inodes zu lesen, bevor die ersten geschrieben werden (vorausgesetzt, Sie haben genügend freien Arbeitsspeicher für den Festplatten-Cache). Ich schlage vor:Die gute Lösung: ACLs
Die gute Lösung kann völlig anders aussehen: Wenn die Dateien in diesem Verzeichnis erstellt (und nicht von einem anderen Ort verschoben) werden, können ACLs die Aufgabe im Handumdrehen erledigen. Sie müssen lediglich die Standard-ACLs für das übergeordnete Verzeichnis festlegen.
Weitere Verbesserungen können durch Dateisystemoptimierungen erreicht werden. Wenn es ext3 / ext4 ist, können Sie
e2fsck -D
von Zeit zu Zeit ausführen . Vielleicht hilft es, dieses Verzeichnis auf ein separates Volume zu legen. Sie können verschiedene Dateisysteme oder Dateisystemeinstellungen ausprobieren (z. B. verschiedene Inode-Größen).quelle
find
Lösung verdoppelte meine Zeitchmod
in einem Hafencontainer.Angenommen, Sie verwenden
chmod
das GNU-Paket coreutils unter Ubuntu 12.10.chmod 775 . -R
führt denfchmodat
Systemaufruf für jede gefundene Datei aus, unabhängig davon, ob die Berechtigungen geändert werden müssen oder nicht. Ich bestätigte dies, indem ich den Codestrace chmod 775 . -R
überprüfte und (Ausschnitt unten) verwendete, um das tatsächliche Verhalten aufzulisten.Die Ausführung
fchmodat
jeder Datei hat einige Nachteilefind
/xargs
/chmod
Methode von anderen erwähnt wird wahrscheinlich schneller sein , indem nur Dateien zu ändern , die geändert werden müssen.fchmodat
Ändern der Dateistatusänderung (ctime) jeder Datei. Dies führt dazu, dass sich jede Datei / jeder Inode jedes Mal ändert und wahrscheinlich zu einem Überschuss an Schreibzugriffen auf die Festplatte führt. Möglicherweise können Mount-Optionen verwendet werden, um diese überschüssigen Schreibvorgänge zu stoppen.Ein einfaches Experiment zeigt die zeitlichen Änderungen, die gerade stattfinden
chmod
Aber das ändert sich nicht für
find
/xargs
/chmod
ein paar Minuten späterIch würde immer dazu neigen , die verwenden
find
/xargs
/chmod
Version , da find mehr Kontrolle über die Auswahl Dinge gibt.quelle
Die [Quelle] (1) zeigt, dass
chmod(1)
immer versucht wird, den Modus zu setzen und dann mit [fstatat (2)] (2) erneut nachgesehen wird.Dateien werden über [fts (3)] (3) verarbeitet, das zuvor alle durchsuchten Dateisystemobjekte 'statisieren' muss, um seinen Datenbaum zu erstellen.
Unixlore enthält einen [netten Artikel] (4), in dem
chmod(1)
gegen einenfind
/xargs
-Ansatz getimt wird : Letzterer gewinnt um Größenordnungen.Hier die Kommandozeile angepasst an die ursprüngliche Frage:
Zwei Gründe:
Das Durchlaufen des Dateisystems wird über die Pipe zwischen den beiden Prozessen, die möglicherweise sogar auf verschiedenen Kernen ausgeführt werden, von den Operationen auf den Dateien entkoppelt.
fts(3)
Der Vorgang wird minimiert, daxargs(1)
der Verzeichnisbaum "geglättet" wird.Also ja: Du solltest auf jeden Fall
find
/ verwendenxargs
. für eine einfache Lösung.Andere Optionen:
Spielen Sie mit der [umask] (5) und dem Quellcode der Prozesse, die die neuen Dateien schreiben.
Wenn Sie Linux verwenden, hat Ihr System möglicherweise das
inotify
Kernel-Subsystem aktiviert . In diesem Fall können Sie über [inotifywait (1)] (6) ein Skript für eine effiziente Lösung erstellen.Anmerkung: Sofern Sie keine Ausführungsberechtigungen für Ihre Dateien wünschen, würde ich vorschlagen, den Aufruf folgendermaßen zu ändern:
Hinweis an die Redaktion: Es ist mir nicht gestattet, mehr als zwei Links zum Beitrag hinzuzufügen oder andere Beiträge zu kommentieren. Ich lasse die URLs hier und hoffe, dass ein aufgeschlossener Benutzer mit ausreichendem Ruf sie wieder in den Text einfügt und diesen Absatz löscht.
Kommentar zum Priming des Festplattencaches mit
find . -printf ""
:Dies kann die Ausführung der folgenden
chmod
Vorgänge beschleunigen , hängt jedoch vom verfügbaren Speicher und der E / A-Last ab. So könnte es funktionieren oder nicht. Das Entkoppeln von traversal (find
) undchmod
operation ermöglicht bereits das Zwischenspeichern, sodass das Vorbereiten des Cache möglicherweise überflüssig ist.quelle
Haben Sie darüber nachgedacht, die Prozesse, mit denen die Datei erstellt wird, so zu ändern, dass sie im 0775-Modus erstellt werden? Schauen Sie sich den umask-Wert in der Umgebung an - 0002 könnte helfen.
quelle