Bagaimana menemukan pid dari proses yang telah menghapus file?

13

Saya sedang mengerjakan proyek yang berkaitan dengan migrasi VM. Terkadang gambar VM akan hilang dan saya hanya ingin tahu siapa pelakunya. Saya mencoba strace pada proses yang mencurigakan tetapi tidak berhasil.

Mohammad
sumber
Saya berharap menemukan cara untuk melacak pembatalan panggilan sistem pada setiap proses, bukan hanya satu tapi saya kira tidak ada cara mudah untuk melakukan ini ...
Mohammad

Jawaban:

14

Akhirnya saya menemukan jawabannya di sini .

Daemon Audit Linux akan melakukan triknya.

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

lalu

ausearch -f /path/to/somefile -i
Mohammad
sumber
bagus, tetapi bagaimana pengaruhnya terhadap kinerja?
vartec
@vartec tidak terlalu banyak, setelah menyetel linux-audit.com/tuning-auditd-high-performance-linux-auditing
Nikolay Fominyh
1

Anda dapat mengetahui PID suatu proses, yang menggunakan beberapa file terbuka lsof.

Setelah file ditutup dan dihapus, Anda tidak dapat memperoleh informasi itu.

BTW. Perlu diingat, bahwa menghapus file adalah operasi pada direktori, bukan pada file itu sendiri.

vartec
sumber
Sayangnya tidak perlu membuka file untuk menghapusnya. Setidaknya sebagai contoh, output "strace rm some-file" tidak menunjukkan bahwa perintah rm pertama-tama membuka file dan kemudian menghapusnya. Jadi kurasa lsof tidak membantu.
Mohammad
Baca kalimat terakhir jawaban saya
vartec
1

Izinkan saya menyarankan alternatif dengan sysdig karena jawaban di atas sudah menua. Biarkan menampilkan piddan nameproses yang menghapus file /tmp/test. Pertama kita membuat file dengan touch /tmp/test. Kemudian kita mulai sysdigdengan filter berikut:

$ 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)membutuhkan orfilter jika jalur (mis. evt.arg.name) mungkin relatif . Untuk menangani keduanya unlink(panggilan mana unlink(2)) dan rm(panggilan mana unlinkat(2)dalam versi GNU-nya), filter harus cocok dengan kedua syscall.

sysdigharus berjalan ketika suatu proses menghapus file. Lalu ketika kita menjalankan perintah seperti itu:

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

Ini akan menampilkan output seperti itu:

11380,unlink
11407,rm
11662,rm

Silakan merujuk ke panduan pengguna sysdig untuk penjelasan tentang pemfilteran dan keluaran.

Karena saringannya cukup panjang, saya merasa nyaman untuk menulis pahat. Ini adalah skrip lua yang dikaitkan dengan sysdigperintah:

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

Jangan ragu untuk berkomentar dan memperbaikinya. Anda dapat meletakkan skrip lua dalam spy_deletes.luafile di dalam direktori dan mengeksekusi sysdigdi direktori ini untuk membuat pahat tersedia. Saat mengetik sudo sysdig -clAnda akan melihatnya sebagai:

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

Sekarang Anda bisa menyebutnya:

$ sudo sysdig -c spy_deletes /tmp/test

Dan dalam jenis terminal lain:

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

Ini akan menampilkan:

16025   unlink
16033   unlink
16041   rm
16049   rm

The unlinkatFilter akan layak untuk menjadi lebih akurat dan hanya cocok dengan path absolut. Ini akan membutuhkan untuk mengambil fd dari direktori yang dilewati unlinkat(2).

Greg Leclercq
sumber
Saya tidak memiliki output dengan perintah Anda.
AB
Saya sedang mengetik rm /tmp/testdi terminal lain. Saya mengedit jawaban saya untuk membuatnya lebih jelas.
Greg Leclercq