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.
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 ...
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
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
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:
$ 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).
Jawaban:
Akhirnya saya menemukan jawabannya di sini .
Daemon Audit Linux akan melakukan triknya.
lalu
sumber
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.
sumber
Izinkan saya menyarankan alternatif dengan sysdig karena jawaban di atas sudah menua. Biarkan menampilkan
pid
danname
proses yang menghapus file/tmp/test
. Pertama kita membuat file dengantouch /tmp/test
. Kemudian kita mulaisysdig
dengan filter berikut:unlinkat(2)
membutuhkanor
filter jika jalur (mis.evt.arg.name
) mungkin relatif . Untuk menangani keduanyaunlink
(panggilan manaunlink(2)
) danrm
(panggilan manaunlinkat(2)
dalam versi GNU-nya), filter harus cocok dengan kedua syscall.sysdig
harus berjalan ketika suatu proses menghapus file. Lalu ketika kita menjalankan perintah seperti itu:Ini akan menampilkan output seperti itu:
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
sysdig
perintah:Jangan ragu untuk berkomentar dan memperbaikinya. Anda dapat meletakkan skrip lua dalam
spy_deletes.lua
file di dalam direktori dan mengeksekusisysdig
di direktori ini untuk membuat pahat tersedia. Saat mengetiksudo sysdig -cl
Anda akan melihatnya sebagai:Sekarang Anda bisa menyebutnya:
Dan dalam jenis terminal lain:
Ini akan menampilkan:
The
unlinkat
Filter akan layak untuk menjadi lebih akurat dan hanya cocok dengan path absolut. Ini akan membutuhkan untuk mengambil fd dari direktori yang dilewatiunlinkat(2)
.sumber
rm /tmp/test
di terminal lain. Saya mengedit jawaban saya untuk membuatnya lebih jelas.