Jak znaleźć numer pid procesu, który usunął plik?


13

Pracuję nad projektem związanym z migracją VM. Czasami obraz VM zniknie, a ja po prostu chcę wiedzieć, kto jest winowajcą. Próbowałem śledzić podejrzane procesy, ale bezskutecznie.


Miałem nadzieję znaleźć sposób na śledzenie wywołania systemowego rozłączenia dla każdego procesu zamiast tylko jednego, ale wydaje mi się, że nie ma łatwego sposobu, aby to zrobić ...
Mohammad

Odpowiedzi:



1

Możesz znaleźć PID procesu, w którym niektóre pliki są otwarte przy użyciu lsof.

Po zamknięciu i usunięciu pliku nie można uzyskać tych informacji.

BTW. Pamiętaj, że usunięcie pliku jest operacją na katalogu, w którym się znajduje, a nie na samym pliku.


Niestety nie ma potrzeby otwierania pliku, aby go usunąć. Przynajmniej na przykład dane wyjściowe „strace rm some-file” nie pokazują, że polecenie rm najpierw otwiera plik, a następnie usuwa go. Więc myślę, że lsof nie jest pomocny.
Mohammad

Przeczytaj ostatnie zdanie mojej odpowiedzi
vartec

1

Pozwól, że zasugeruję alternatywę dla sysdig, ponieważ powyższe odpowiedzi się starzeją. Pozwól wyświetlić pidi nameprocesów, które usuwają plik /tmp/test. Najpierw tworzymy plik za pomocą touch /tmp/test. Następnie zaczynamy sysdigod następującego filtra:

$ 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)wymaga orfiltra, jeśli ścieżka (np. evt.arg.name) może być względna . Aby obsłużyć oba unlink(które wywołania unlink(2)) i rm(które wywołują unlinkat(2)w wersji GNU), filtr powinien pasować do obu wywołań systemowych.

sysdigpowinien być uruchomiony, gdy proces usuwa plik. Następnie, gdy wykonujemy takie polecenia:

$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test

Wyświetli takie wyjście:

11380,unlink
11407,rm
11662,rm

Objaśnienie dotyczące filtrowania i danych wyjściowych znajduje się w podręczniku użytkownika sysdig .

Ponieważ filtr jest dość długi, wygodne było napisanie dłuta. Jest to skrypt lua powiązany z sysdigpoleceniem:

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

Skomentuj i popraw. Możesz umieścić skrypt lua w spy_deletes.luapliku w katalogu i wykonać sysdigw tym katalogu, aby udostępnić dłuto. Podczas pisania sudo sysdig -clzobaczysz to jako:

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

Teraz możesz to nazwać:

$ sudo sysdig -c spy_deletes /tmp/test

I w innym typie terminala:

$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test

Wyprowadzi:

16025   unlink
16033   unlink
16041   rm
16049   rm

unlinkatFiltr będzie zasługują na dokładniejsze i tylko dopasować ścieżkę bezwzględną. Wymagałoby to odzyskania fd z katalogu przekazanego unlinkat(2).


Nie mam wyjścia z twoim poleceniem.
AB

Wpisałem rm /tmp/testinny terminal. Zredagowałem swoją odpowiedź, aby była jaśniejsza.
Greg Leclercq,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.