time
ist ein brillanter Befehl, wenn Sie herausfinden möchten, wie viel CPU-Zeit ein bestimmter Befehl benötigt.
Ich suche nach etwas Ähnlichem, das die Dateien auflisten kann, auf die von einem Programm und seinen Kindern zugegriffen wird. Entweder in Echtzeit oder als Bericht danach.
Zur Zeit benutze ich:
#!/bin/bash
strace -ff -e trace=file "$@" 2>&1 | perl -ne 's/^[^"]+"(([^\\"]|\\[\\"nt])*)".*/$1/ && print'
Es schlägt jedoch fehl, wenn der auszuführende Befehl einschließt sudo
. Es ist nicht sehr intelligent (es wäre schön, wenn es nur Dateien auflisten könnte, die existieren oder Berechtigungsprobleme hatten, oder sie in gelesene und geschriebene Dateien gruppieren könnte). Ist auch strace
langsam, also wäre es gut mit einer schnelleren Wahl.
files
monitoring
strace
Ole Tange
quelle
quelle
strace
gehe ich davon aus, dass Sie speziell an Linux interessiert sind. Richtig?Antworten:
Ich habe aufgegeben und mein eigenes Werkzeug programmiert. Um aus seinen Dokumenten zu zitieren:
Es werden nur die Dateien ausgegeben, sodass Sie sich nicht mit der Ausgabe von befassen müssen
strace
.https://gitlab.com/ole.tange/tangetools/tree/master/tracefile
quelle
make && sudo make install
. Dann kannst du rennenman tracefile
.yum -y install https://extras.getpagespeed.com/release-el7-latest.rpm
undyum -y install tracefile
Sie können die Systemaufrufe mit verfolgen
strace
, aber es gibt in der Tat eine unvermeidliche Geschwindigkeitsstrafe. Sie müssenstrace
als root ausgeführt werden, wenn der Befehl mit erhöhten Rechten ausgeführt wird:Eine andere Methode , die schneller sein dürfte ist , ist eine Bibliothek vorab zu laden, die sich um Dateisystem - Zugriffsfunktionen wickelt:
LD_PRELOAD=/path/to/libmywrapper.so mycommand
. DieLD_PRELOAD
Umgebungsvariable wird nicht an Programme übergeben, die mit erhöhten Rechten aufgerufen werden. Sie müssten den Code dieser Wrapperbibliothek schreiben ( hier ein Beispiel aus „Erstellen von Interposern für die Bibliothek aus Spaß und Gewinn“ ). Ich weiß nicht, ob im Web wiederverwendbarer Code verfügbar ist.Wenn Sie die Dateien in einer bestimmten Verzeichnishierarchie überwachen, können Sie mit LoggedFS eine Ansicht des Dateisystems erstellen , sodass alle Zugriffe über diese Ansicht protokolliert werden.
Um LoggedFS zu konfigurieren, beginnen Sie mit der mit dem Programm gelieferten Beispielkonfiguration und lesen Sie die Syntax der LoggedFS-Konfigurationsdatei .
Eine andere Möglichkeit ist das Audit-Subsystem von Linux . Stellen Sie sicher, dass der
auditd
Dämon gestartet ist, und konfigurieren Sie dann, mit was Sie sich anmelden möchtenauditctl
. Jeder protokollierte Vorgang wird in/var/log/audit/audit.log
(bei typischen Distributionen) aufgezeichnet . So starten Sie das Ansehen einer bestimmten Datei:Wenn Sie ein Verzeichnis überwachen, werden auch die darin enthaltenen Dateien und deren Unterverzeichnisse rekursiv überwacht. Achten Sie darauf, das Verzeichnis mit den Überwachungsprotokollen nicht zu überwachen. Sie können die Protokollierung auf bestimmte Prozesse beschränken. Informationen zu
auditctl
den verfügbaren Filtern finden Sie auf der Manpage. Sie müssen als Root angemeldet sein, um das Audit-System verwenden zu können.quelle
LD_PRELOAD
funktioniert auch nicht auf statischen Binärdateien.Ich denke, Sie wollen lsof (möglicherweise zu einem Grep auf dem Programm und es ist Kinder). Es wird Ihnen jede Datei anzeigen, auf die aktuell im Dateisystem zugegriffen wird. Informationen darüber, auf welche Dateien der Prozess zugreift ( von hier aus ):
quelle
Ich habe es versucht
tracefile
. Für mich gab es viel weniger Übereinstimmungen als meine eigenenstrace ... | sed ... | sort -u
. Ich habe sogar-s256
diestrace(1)
Befehlszeile hinzugefügt , aber es hat nicht viel geholfen ...Dann habe ich das versucht
loggedfs
. Zuerst schlug es fehl, da ich keinen Lese- / Schreibzugriff auf das Verzeichnis hatte, mit dem ich mich anmelden wollte. Nachdem ich vorübergehend chmod 755 gemacht habe, habe ich ein paar Hits bekommen ...Für mich scheint es jedoch am besten zu sein, Folgendes zu tun:
inotifywait -m -r -e OPEN /path/to/traced/directory
Anschließend wird die Ausgabe nach dem Ausführen des gewünschten Prozesses nachbearbeitet.
Dies erfasst weder den Dateizugriffsprozess außerhalb des verfolgten Verzeichnisses, noch weiß dies, ob ein anderer Prozess auf denselben Verzeichnisbaum zugegriffen hat, aber in vielen Fällen ist dies ein ausreichend gutes Tool, um die Aufgabe zu erledigen.
BEARBEITEN: inotifywait fängt keinen Symlink-Zugriff ab (nur die Ziele, nachdem die Symlinks aufgelöst wurden). Das traf mich, als ich Bibliotheken archivierte, auf die ein Programm für die zukünftige Verwendung zugreift. Verwenden Sie eine zusätzliche Perl-Glob-Hackerei, um die Symlinks in den gemeldeten Bibliotheken auszuwählen, um die Arbeit in diesem speziellen Fall zu erledigen.
EDIT2: Zumindest wenn sich Dateien und Symlinks über die Befehlszeilenausgabe inotifywait (z. B.
inotifywait -m file symlink
oderinotifywait symlink file
) inotifizieren, wird der Zugriff darauf angezeigt , welche zuerst in der Befehlszeile angezeigt wird (unabhängig davon, auf welchefile
vonsymlink
zugegriffen wird). inotifywait unterstützt IN_DONT_FOLLOW nicht - was, als ich es programmatisch versuchte, einem den Zugriff auffile
(was möglicherweise erwartet wird, oder auch nicht ...) unabhängig von der Reihenfolge in der Befehlszeile anzeigtquelle
tracefile
Fehlen eines Dateizugriffs teilen ?Auch wenn es Ihnen (noch?) Nicht genug Kontrolle gibt, habe ich ein Programm geschrieben, das Ihre Anforderungen zumindest teilweise erfüllt. Dabei wird das Fanotify und Unshare des Linux-Kernels verwendet, um nur Dateien zu überwachen, die von einem bestimmten Prozess und seinen untergeordneten Elementen geändert (oder gelesen) wurden . Im Vergleich zu strace ist es ziemlich schnell (;
Es kann auf https://github.com/tycho-kirchner/shournal gefunden werden
Beispiel auf der Shell:
quelle