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ć ...
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
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
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
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:
$ 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).
Odpowiedzi:
W końcu znalazłem odpowiedź tutaj .
Demon kontroli systemu Linux załatwi sprawę.
i wtedy
źródło
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.
źródło
Pozwól, że zasugeruję alternatywę dla sysdig, ponieważ powyższe odpowiedzi się starzeją. Pozwól wyświetlić
pid
iname
procesów, które usuwają plik/tmp/test
. Najpierw tworzymy plik za pomocątouch /tmp/test
. Następnie zaczynamysysdig
od następującego filtra:unlinkat(2)
wymagaor
filtra, jeśli ścieżka (np.evt.arg.name
) może być względna . Aby obsłużyć obaunlink
(które wywołaniaunlink(2)
) irm
(które wywołująunlinkat(2)
w wersji GNU), filtr powinien pasować do obu wywołań systemowych.sysdig
powinien być uruchomiony, gdy proces usuwa plik. Następnie, gdy wykonujemy takie polecenia:Wyświetli takie wyjście:
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
sysdig
poleceniem:Skomentuj i popraw. Możesz umieścić skrypt lua w
spy_deletes.lua
pliku w katalogu i wykonaćsysdig
w tym katalogu, aby udostępnić dłuto. Podczas pisaniasudo sysdig -cl
zobaczysz to jako:Teraz możesz to nazwać:
I w innym typie terminala:
Wyprowadzi:
unlinkat
Filtr będzie zasługują na dokładniejsze i tylko dopasować ścieżkę bezwzględną. Wymagałoby to odzyskania fd z katalogu przekazanegounlinkat(2)
.źródło
rm /tmp/test
inny terminal. Zredagowałem swoją odpowiedź, aby była jaśniejsza.