Bagaimana cara menemukan file besar yang telah dihapus tetapi masih terbuka di aplikasi? Bagaimana seseorang dapat menghapus file seperti itu, meskipun suatu proses membuatnya terbuka?
Situasinya adalah bahwa kami menjalankan proses yang mengisi file log pada tingkat yang luar biasa. Saya tahu alasannya, dan saya bisa memperbaikinya. Sampai saat itu, saya ingin rm atau mengosongkan file log tanpa mematikan proses.
Cukup melakukan rm output.log
hanya menghapus referensi ke file, tetapi terus menempati ruang pada disk hingga proses dihentikan. Lebih buruk lagi: 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 dalam proses lain?
Saya secara khusus merujuk ke sistem operasi berbasis Linux seperti Debian atau RHEL.
rm
file ed yang masih terbuka?
lsof | grep "(deleted)"
. Ketika tidak ada lagi proses menahan file yang dihapus terbuka, kernel akan membebaskan blok inode dan disk. Proses tidak memiliki "penangan" di mana mereka dapat diberitahu bahwa file yang terbuka, pada dasarnya terkunci, telah dihapus dari disk.
lsof | grep '(deleted)'
bekerja di Linux juga. Di Linux, Anda dapat diberitahu tentang penghapusan file (bahkan file yang sudah tidak memiliki entri di direktori apa pun selain / proc / some-pid / fd lagi) dengan mekanisme inotify (acara IN_DELETE_SELF)
somefile
dan membukanya di VIM, lalu rm
mengeditnya di proses bash lain. Saya kemudian jalankan lsof | grep somefile
dan tidak ada di sana, meskipun file terbuka di VIM.
lsof -p <pid>
untuk daftar file yang terbuka dan ukurannya. File yang dihapus akan memiliki di(deleted)
sebelahnya. File yang dihapus mungkin ditautkan pada/proc/<pid>/fd/1
. Saya tidak tahu bagaimana membuat proses berhenti menulis ke deskriptor file tanpa menghentikannya. Saya pikir itu akan tergantung pada prosesnya.