GNU/Linux >> Belajar Linux >  >> Linux

Temukan Dan Hapus File Besar Yang Terbuka Tetapi Telah Dihapus?

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", ....) .


Linux
  1. Mendapatkan Semua File Yang Telah Dimodifikasi Pada Tanggal Tertentu?

  2. Bagaimana saya bisa menggunakan xargs untuk menyalin file yang memiliki spasi dan tanda kutip di namanya?

  3. Temukan dan salin file

  1. Cara Menemukan file besar linux dengan perintah find dan du

  2. Cara Memulihkan File Yang Telah Saya Hapus Tetapi Masih Terbuka Di Suatu Tempat?

  3. Hapus file yang dimulai dengan tetapi tidak berisi

  1. Buat dan hapus file swap di Ubuntu

  2. Linux:hapus ekstensi file untuk banyak file

  3. tautan simbolik:temukan semua file yang terhubung ke file ini