Я работаю над проектом, связанным с миграцией виртуальных машин. Иногда образ виртуальной машины исчезает, и я просто хочу знать, кто виноват. Я пытался избавиться от подозрительных процессов, но безрезультатно.
Я надеялся найти способ отследить системный вызов unlink для каждого процесса вместо одного, но я думаю, что не существует простого способа сделать это ...
К сожалению, нет необходимости открывать файл, чтобы удалить его. По крайней мере, например, вывод "strace rm some-file" не показывает, что команда 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
Поскольку фильтр довольно длинный, мне было удобно писать долото. Это скрипт 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
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
Не стесняйтесь комментировать и улучшать его. Вы можете поместить скрипт lua в spy_deletes.luaфайл внутри каталога и выполнить sysdigв этом каталоге, чтобы сделать доступным долото. При наборе sudo sysdig -clвы увидите это как:
$ 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).
Ответы:
Наконец я нашел ответ здесь .
Демон Linux Audit сделает свое дело.
а потом
источник
Вы можете узнать PID процесса, у которого есть файл, открытый с помощью
lsof
.После того, как файл закрыт и удален, вы не можете получить эту информацию.
КСТАТИ. Помните, что удаление файла - это операция с каталогом, в котором он находится, а не с самим файлом.
источник
Позвольте мне предложить альтернативу с sysdig, поскольку ответы выше стареют. Позвольте отобразить
pid
иname
процессов, которые удаляют файл/tmp/test
. Сначала мы создаем файл сtouch /tmp/test
. Затем мы начнемsysdig
со следующего фильтра:unlinkat(2)
требуетor
фильтра, если путь (напримерevt.arg.name
) может быть относительным . Для обработки обоихunlink
(какие вызовыunlink(2)
) иrm
(какие вызовыunlinkat(2)
в своей версии GNU) фильтр должен соответствовать обоим системным вызовам.sysdig
должен быть запущен, когда процесс удаляет файл. Затем, когда мы выполняем такие команды:Будет отображаться такой вывод:
Пожалуйста, обратитесь к руководству пользователя sysdig для объяснения фильтрации и вывода.
Поскольку фильтр довольно длинный, мне было удобно писать долото. Это скрипт lua, связанный с
sysdig
командой:Не стесняйтесь комментировать и улучшать его. Вы можете поместить скрипт lua в
spy_deletes.lua
файл внутри каталога и выполнитьsysdig
в этом каталоге, чтобы сделать доступным долото. При набореsudo sysdig -cl
вы увидите это как:Теперь вы можете назвать это:
И в другом терминале типа:
Это выведет:
unlinkat
Фильтр заслуживает , чтобы быть более точными и соответствовать только абсолютному пути. Это потребует получения fd каталога, переданного вunlinkat(2)
.источник
rm /tmp/test
в другом терминале. Я отредактировал свой ответ, чтобы сделать его более понятным.