Як знайти pid процесу, який видалив файл?


13

Я працюю над проектом, пов'язаним з міграцією ВМ. Іноді образ VM зникне, і я просто хочу знати, хто винуватець. Я намагався напружуватися у підозрілих процесах, але безрезультатно.


Я сподівався знайти спосіб відстежити системне виклик кожного процесу замість одного, але, мабуть, немає простого способу зробити це ...
Мохаммад

Відповіді:



1

Ви можете дізнатись PID процесу, який відкриває якийсь файл lsof.

Після закриття та видалення файлу ви не зможете отримати цю інформацію.

До речі. Майте на увазі, що видалення файлу - це операція в каталозі, в якому він знаходиться, а не в самому файлі.


На жаль, не потрібно відкривати файл, щоб видалити його. Принаймні, наприклад, "strace rm деякий файл" не показує, що команда rm спочатку відкриває файл, а потім видаляє його. Тож я думаю, що lsof не корисний.
Мохаммед

Прочитайте останнє речення моєї відповіді
vartec

1

Дозвольте запропонувати альтернативу sysdig, оскільки відповіді вище старіють. Дозвольте відобразити pidта nameпроцеси, які видаляють файл /tmp/test. Спочатку ми створюємо файл за допомогою touch /tmp/test. Потім ми починаємо sysdigз наступного фільтра:

$ 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)потрібен orфільтр, якщо шлях (наприклад evt.arg.name) може бути відносним . Щоб обробляти як unlink(які дзвінки unlink(2)), так і rm(які дзвінки unlinkat(2)у своїй GNU-версії), фільтр повинен відповідати обом системним викликам.

sysdigмає працювати, коли процес видаляє файл. Тоді, коли ми виконуємо такі команди:

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

Він відобразить такий вихід:

11380,unlink
11407,rm
11662,rm

Щоб отримати пояснення щодо фільтрування та виведення, зверніться до посібника користувача sysdig .

Оскільки фільтр досить довгий, мені було зручно писати зубило. Це сценарій lua, який асоціюється з sysdigкомандою:

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

Сміливо коментуйте та вдосконалюйте. Ви можете помістити скрипт lua у spy_deletes.luaфайл всередині каталогу та виконати sysdigв цьому каталозі, щоб зробити долото доступним. Під час введення sudo sysdig -clви побачите це як:

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

Тепер ви можете назвати це:

$ sudo sysdig -c spy_deletes /tmp/test

І в іншому типі терміналів:

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

Він виведе:

16025   unlink
16033   unlink
16041   rm
16049   rm

unlinkatФільтр заслуговує , щоб бути більш точними і відповідати тільки абсолютного шляху. Для цього знадобиться отримати fd каталогу, переданого в unlinkat(2).


Я не маю виводу з вашої команди.
AB

Я друкувала rm /tmp/testв іншому терміналі. Я відредагував свою відповідь, щоб зробити її зрозумілішою.
Грег Леклерк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.