Я работаю над проектом, связанным с миграцией виртуальных машин. Иногда образ виртуальной машины исчезает, и я просто хочу знать, кто виноват. Я пытался избавиться от подозрительных процессов, но безрезультатно.
Я работаю над проектом, связанным с миграцией виртуальных машин. Иногда образ виртуальной машины исчезает, и я просто хочу знать, кто виноват. Я пытался избавиться от подозрительных процессов, но безрезультатно.
Ответы:
Наконец я нашел ответ здесь .
Демон Linux Audit сделает свое дело.
sudo auditctl -w /path/to/somefile -p wra
а потом
ausearch -f /path/to/somefile -i
Вы можете узнать PID процесса, у которого есть файл, открытый с помощью lsof
.
После того, как файл закрыт и удален, вы не можете получить эту информацию.
КСТАТИ. Помните, что удаление файла - это операция с каталогом, в котором он находится, а не с самим файлом.
Позвольте мне предложить альтернативу с 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)
.
rm /tmp/test
в другом терминале. Я отредактировал свой ответ, чтобы сделать его более понятным.