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.

Mohammad
quelle
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 ...
Mohammad

Antworten:

1

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.

vartec
quelle
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

Es wird eine solche Ausgabe angezeigt:

11380,unlink
11407,rm
11662,rm

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 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
    return true
end

function 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 .. ")")
    return true
end

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:

Category: files
---------------
spy_deletes         spy file deletion

Jetzt können Sie es anrufen:

$ sudo sysdig -c spy_deletes /tmp/test

Und in einem anderen Terminaltyp:

$ 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).

Greg Leclercq
quelle
Ich habe keine Ausgabe mit Ihrem Befehl.
AB
Ich habe rm /tmp/testin einem anderen Terminal getippt. Ich habe meine Antwort bearbeitet, um sie klarer zu machen.
Greg Leclercq