Bagaimana cara menemukan file besar yang telah dihapus tetapi masih terbuka di aplikasi? Bagaimana cara menghapus file seperti itu, meskipun proses telah membukanya?
Situasinya adalah kami menjalankan proses yang mengisi file log dengan kecepatan tinggi. Saya tahu alasannya, dan saya bisa memperbaikinya. Sampai saat itu, saya ingin rm atau mengosongkan file log tanpa mematikan proses.
Cukup lakukan rm output.log
menghapus hanya referensi ke file, tetapi terus menempati ruang pada disk sampai proses dihentikan. Lebih buruk:setelah rm
ing Saya sekarang tidak punya cara untuk menemukan di mana file itu atau seberapa besar itu! Apakah ada cara untuk menemukan file, dan mungkin mengosongkannya, meskipun masih terbuka di proses lain?
Saya secara khusus merujuk pada sistem operasi berbasis Linux seperti Debian atau RHEL.
Jawaban yang Diterima:
Jika Anda tidak dapat mematikan aplikasi Anda, Anda dapat memotong alih-alih menghapus file log untuk mendapatkan kembali ruang tersebut. Jika file tidak terbuka dalam mode penambahan (dengan O_APPEND
), maka file akan tampak sebesar sebelumnya saat aplikasi menulisnya (walaupun dengan bagian awal yang jarang dan tampak seolah-olah berisi NUL byte), tetapi ruang tersebut akan diambil kembali (yang tidak berlaku untuk HFS+ sistem file di Apple OS/X yang tidak mendukung file jarang).
Untuk memotongnya:
: > /path/to/the/file.log
Jika sudah dihapus, di Linux, Anda masih dapat memotongnya dengan melakukan:
: > "/proc/$pid/fd/$fd"
Dimana $pid
adalah id proses dari proses yang membuka file, dan $fd
satu deskriptor file yang membukanya (yang dapat Anda periksa dengan lsof -p "$pid"
.
Jika Anda tidak tahu pid, dan mencari file yang dihapus, Anda dapat melakukan:
lsof -nP | grep '(deleted)'
lsof -nP +L1
, seperti yang disebutkan oleh @user75021 adalah opsi yang lebih baik (lebih andal dan lebih portabel) (mendaftarkan file yang memiliki kurang dari 1 tautan).
Atau (di Linux):
find /proc/*/fd -ls | grep '(deleted)'
Atau untuk menemukan yang besar dengan zsh
:
ls -ld /proc/*/fd/*(-.LM+1l0)
Alternatifnya, jika aplikasi ditautkan secara dinamis adalah dengan melampirkan debugger padanya dan membuatnya memanggil close(fd)
diikuti oleh open("the-file", ....)
.