Come trovare il pid del processo che ha eliminato un file?


13

Sto lavorando a un progetto relativo alla migrazione della VM. A volte l'immagine della VM scompare e voglio solo sapere chi è il colpevole. Ho provato a fare passi in avanti su processi sospetti ma senza risultati.


Speravo di trovare un modo per rintracciare la chiamata di sistema scollegata su ogni processo anziché su uno solo, ma immagino non ci sia un modo semplice per farlo ...
Mohammad,

Risposte:



1

È possibile scoprire il PID di un processo, che ha alcuni file aperti utilizzando lsof.

Una volta chiuso ed eliminato il file, non è possibile ottenere tali informazioni.

BTW. Tieni presente che l'eliminazione di un file è un'operazione sulla directory in cui si trova, non su un file stesso.


Sfortunatamente non è necessario aprire un file per eliminarlo. Almeno per esempio l'output "strace rm some-file" non mostra che il comando rm prima apre il file e poi lo elimina. Quindi immagino che lsof non sia utile.
Mohammad,

Leggi l'ultima frase della mia risposta
vartec,

1

Vorrei suggerire un'alternativa con sysdig poiché le risposte sopra stanno invecchiando. Consentire di visualizzare il pide namedei processi che eliminano il file /tmp/test. Per prima cosa creiamo il file con touch /tmp/test. Quindi iniziamo sysdigcon il seguente 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)richiede un orfiltro se il percorso (ad es. evt.arg.name) può essere relativo . Per gestire sia unlink(che chiama unlink(2)) che rm(che chiama unlinkat(2)nella sua versione GNU), il filtro dovrebbe corrispondere ad entrambi i syscall.

sysdigdovrebbe essere in esecuzione quando un processo elimina il file. Quindi quando eseguiamo tali comandi:

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

Verrà visualizzato un tale output:

11380,unlink
11407,rm
11662,rm

Consultare la guida per l' utente di sysdig per una spiegazione sul filtro e sull'output.

Dato che il filtro è piuttosto lungo, ho trovato conveniente scrivere uno scalpello. È uno script lua associato a un sysdigcomando:

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

Sentiti libero di commentare e migliorarlo. È possibile inserire lo script lua in un spy_deletes.luafile all'interno di una directory ed eseguirlo sysdigin questa directory per rendere disponibile lo scalpello. Durante la digitazione sudo sysdig -cllo vedrai come:

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

Ora puoi chiamarlo:

$ sudo sysdig -c spy_deletes /tmp/test

E in un altro tipo di terminale:

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

Produrrà:

16025   unlink
16033   unlink
16041   rm
16049   rm

Il unlinkatfiltro meriterebbe di essere più preciso e corrispondere solo al percorso assoluto. Ciò richiederebbe il recupero del file fd della directory passata a unlinkat(2).


Non ho output con il tuo comando.
AB

Stavo scrivendo rm /tmp/testin un altro terminale. Ho modificato la mia risposta per renderlo più chiaro.
Greg Leclercq,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.