Como encontrar o pid do processo que apagou um arquivo?

13

Estou trabalhando em um projeto relacionado à migração de VMs. Às vezes a imagem da VM desaparece e eu só quero saber quem é o culpado. Eu tentei strace em processos suspeitos, mas sem sucesso.

    
por Mohammad 15.06.2011 / 10:55

3 respostas

13

Finalmente, encontrei a resposta aqui .

O daemon do Linux Audit fará o truque.

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

e depois

ausearch -f /path/to/somefile -i
    
por Mohammad 22.06.2011 / 13:54
1

Você pode descobrir o PID de um processo, que tem algum arquivo aberto usando lsof .

Quando o arquivo for fechado e excluído, você não poderá obter essa informação.

BTW. Tenha em mente que a exclusão de um arquivo é uma operação no diretório em que ele está, não em um arquivo em si.

    
por vartec 15.06.2011 / 11:35
1

Deixe-me sugerir uma alternativa com o sysdig , pois as respostas acima estão envelhecidas. Vamos exibir os pid e name dos processos que excluem o arquivo /tmp/test . Primeiro criamos o arquivo com touch /tmp/test . Em seguida, iniciamos sysdig com o seguinte filtro:

$ 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) requer um filtro or se o caminho (por exemplo, evt.arg.name ) puder ser relativo . Para lidar com unlink (que chama unlink(2) ) e rm (que chama unlinkat(2) em sua versão GNU), o filtro deve corresponder aos dois syscalls.

sysdig deve estar em execução quando um processo excluir o arquivo. Então quando nós executamos tais comandos:

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

Ele exibirá essa saída:

11380,unlink
11407,rm
11662,rm

Consulte o guia do usuário do sysdig para obter uma explicação sobre filtragem e saída.

Como o filtro é bem longo, achei conveniente escrever um cinzel. É um script de lua associado a um comando 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

Sinta-se à vontade para comentar e melhorar. Você pode colocar o script lua em um arquivo spy_deletes.lua dentro de um diretório e executar sysdig neste diretório para disponibilizar o formão. Ao digitar sudo sysdig -cl , você verá como:

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

Agora você pode ligar:

$ sudo sysdig -c spy_deletes /tmp/test

E em outro tipo de terminal:

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

Será produzido:

16025   unlink
16033   unlink
16041   rm
16049   rm

O filtro unlinkat merece ser mais preciso e corresponder apenas ao caminho absoluto. Isso exigiria recuperar o fd do diretório passado para unlinkat(2) .

    
por Greg Leclercq 07.08.2015 / 17:04

Tags