Как найти pid процесса, который удалил файл?

13

Я работаю над проектом, связанным с миграцией виртуальных машин. Иногда образ виртуальной машины исчезает, и я просто хочу знать, кто виноват. Я пытался избавиться от подозрительных процессов, но безрезультатно.

Мохаммад
источник
Я надеялся найти способ отследить системный вызов unlink для каждого процесса вместо одного, но я думаю, что не существует простого способа сделать это ...
Мохаммад

Ответы:

14

Наконец я нашел ответ здесь .

Демон Linux Audit сделает свое дело.

sudo auditctl -w /path/to/somefile -p wra

а потом

ausearch -f /path/to/somefile -i
Мохаммад
источник
хорошо, но как это влияет на производительность?
vartec
@vartec не так уж много, после настройки linux-audit.com/tuning-auditd-high-performance-linux-auditing
Николай Фоминых
1

Вы можете узнать PID процесса, у которого есть файл, открытый с помощью lsof.

После того, как файл закрыт и удален, вы не можете получить эту информацию.

КСТАТИ. Помните, что удаление файла - это операция с каталогом, в котором он находится, а не с самим файлом.

Vartec
источник
К сожалению, нет необходимости открывать файл, чтобы удалить его. По крайней мере, например, вывод "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

Будет отображаться такой вывод:

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в другом терминале. Я отредактировал свой ответ, чтобы сделать его более понятным.
Грег Леклерк,