Wie finde ich die PID des Prozesses, der eine Datei gelöscht hat?
13
Ich arbeite an einem Projekt im Zusammenhang mit der VM-Migration. Manchmal verschwindet das VM-Image und ich möchte nur wissen, wer der Schuldige ist. Ich habe mich an verdächtigen Prozessen versucht, aber ohne Erfolg.
Ich habe gehofft , einen Weg zu finden , auf jedem Prozess eine unlink Systemaufruf zu verfolgen , anstatt nur , aber ich denke , es gibt keinen einfachen Weg , dies zu tun ...
Leider muss keine Datei geöffnet werden, um sie zu löschen. Zumindest zeigt die Ausgabe von "strace rm some-file" nicht, dass der Befehl rm die Datei zuerst öffnet und dann löscht. Also ich denke, lsof ist nicht hilfreich.
Mohammad
Lesen Sie den letzten Satz meiner Antwort
vartec
1
Lassen Sie mich eine Alternative mit sysdig vorschlagen, da die obigen Antworten immer älter werden. Lassen Sie sich das pidund nameder Prozesse anzeigen, die die Datei löschen /tmp/test. Zuerst erstellen wir die Datei mit touch /tmp/test. Dann beginnen wir sysdigmit folgendem Filter:
$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'
unlinkat(2)erfordert einen orFilter, wenn der Pfad (z. B. evt.arg.name) relativ sein kann . Um sowohl unlink(welche Aufrufe unlink(2)) als auch rm(welche Aufrufe unlinkat(2)in der GNU-Version) zu verarbeiten, sollte der Filter mit beiden Systemaufrufen übereinstimmen.
sysdigsollte ausgeführt werden, wenn ein Prozess die Datei löscht. Wenn wir dann solche Befehle ausführen:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Da der Filter ziemlich lang ist, fand ich es praktisch, einen Meißel zu schreiben. Es ist ein Lua-Skript, das einem sysdigBefehl zugeordnet ist:
description ="displays processes that delete a file"
short_description ="spy file deletion"
category ="files"
args ={{
name ="path",
description ="the path of the file to monitor",
argtype ="string"},}function on_set_arg(name, val)
path = val
returntrueendfunction on_init()local filename = path
for i in string.gmatch(path,"[^/]+")do
filename = i
end
chisel.set_event_formatter("%proc.pid\t%proc.name")
chisel.set_filter("(evt.type=unlinkat and (evt.arg.name=".. path .." or \
evt.arg.name=".. filename ..")) or \
(evt.type=unlink and evt.arg.path=".. path ..")")returntrueend
Fühlen Sie sich frei zu kommentieren und zu verbessern. Sie können das lua-Skript in einer spy_deletes.luaDatei in einem Verzeichnis ablegen und sysdigin diesem Verzeichnis ausführen , um den Meißel verfügbar zu machen. Während der Eingabe sudo sysdig -clsehen Sie Folgendes:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Es wird ausgegeben:
16025 unlink
16033 unlink
16041 rm
16049 rm
Der unlinkatFilter hätte es verdient, genauer zu sein und nur dem absoluten Pfad zu entsprechen. Dies würde erfordern, das fd des Verzeichnisses abzurufen, das an übergeben wird unlinkat(2).
Antworten:
Endlich habe ich die Antwort hier gefunden .
Der Linux Audit-Daemon erledigt den Trick.
und dann
quelle
Sie können die PID eines Prozesses ermitteln, bei dem eine Datei mit geöffnet wurde
lsof
.Sobald die Datei geschlossen und gelöscht wurde, können Sie diese Informationen nicht mehr abrufen.
Übrigens. Denken Sie daran, dass das Löschen einer Datei in einem Verzeichnis ausgeführt wird, in dem sie sich befindet, nicht in einer Datei selbst.
quelle
Lassen Sie mich eine Alternative mit sysdig vorschlagen, da die obigen Antworten immer älter werden. Lassen Sie sich das
pid
undname
der Prozesse anzeigen, die die Datei löschen/tmp/test
. Zuerst erstellen wir die Datei mittouch /tmp/test
. Dann beginnen wirsysdig
mit folgendem Filter:unlinkat(2)
erfordert einenor
Filter, wenn der Pfad (z. B.evt.arg.name
) relativ sein kann . Um sowohlunlink
(welche Aufrufeunlink(2)
) als auchrm
(welche Aufrufeunlinkat(2)
in der GNU-Version) zu verarbeiten, sollte der Filter mit beiden Systemaufrufen übereinstimmen.sysdig
sollte ausgeführt werden, wenn ein Prozess die Datei löscht. Wenn wir dann solche Befehle ausführen:Es wird eine solche Ausgabe angezeigt:
Weitere Informationen zum Filtern und zur Ausgabe finden Sie im sysdig-Benutzerhandbuch .
Da der Filter ziemlich lang ist, fand ich es praktisch, einen Meißel zu schreiben. Es ist ein Lua-Skript, das einem
sysdig
Befehl zugeordnet ist:Fühlen Sie sich frei zu kommentieren und zu verbessern. Sie können das lua-Skript in einer
spy_deletes.lua
Datei in einem Verzeichnis ablegen undsysdig
in diesem Verzeichnis ausführen , um den Meißel verfügbar zu machen. Während der Eingabesudo sysdig -cl
sehen Sie Folgendes:Jetzt können Sie es anrufen:
Und in einem anderen Terminaltyp:
Es wird ausgegeben:
Der
unlinkat
Filter hätte es verdient, genauer zu sein und nur dem absoluten Pfad zu entsprechen. Dies würde erfordern, das fd des Verzeichnisses abzurufen, das an übergeben wirdunlinkat(2)
.quelle
rm /tmp/test
in einem anderen Terminal getippt. Ich habe meine Antwort bearbeitet, um sie klarer zu machen.