Cara terbaik untuk mengosongkan ruang disk dari file yang dihapus yang ditahan terbuka

28

Hai Saya punya banyak file yang telah dihapus tetapi karena beberapa alasan ruang disk yang terkait dengan file yang dihapus tidak dapat digunakan sampai saya secara eksplisit membunuh proses untuk file mengambil ruang disk

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

Ruang disk yang diambil oleh file yang dihapus di atas menyebabkan masalah seperti ketika mencoba menggunakan kunci tab untuk melengkapi jalur file secara otomatis saya mendapatkan kesalahan bash: cannot create temp file for here-document: No space left on device

Tetapi setelah saya menjalankan kill -9 1623ruang untuk PID itu dibebaskan dan saya tidak lagi mendapatkan kesalahan.

Pertanyaan saya adalah:

  • mengapa ruang ini tidak segera dibebaskan ketika file pertama kali dihapus?
  • apa cara terbaik untuk mendapatkan kembali ruang file yang terkait dengan file yang dihapus?

dan tolong beri tahu saya terminologi yang salah yang saya gunakan atau informasi terkait dan relevan lainnya mengenai situasi ini.

BryanK
sumber

Jawaban:

26

Pada unices, nama file hanyalah pointer (inode) yang mengarah ke memori tempat file berada (yang bisa berupa hard drive atau bahkan sistem file yang didukung RAM). Setiap file mencatat jumlah tautan: tautan dapat berupa nama file (jamak, jika ada banyak tautan keras ke file yang sama), dan juga setiap kali file dibuka, proses sebenarnya menyimpan "tautan" ke ruang yang sama.

Ruang secara fisik dibebaskan hanya jika tidak ada tautan yang tersisa (oleh karena itu, tidak mungkin untuk sampai ke sana). Itu satu-satunya pilihan yang masuk akal: ketika file sedang digunakan, itu tidak penting jika orang lain tidak dapat lagi mengaksesnya: Anda menggunakannya dan sampai Anda menutupnya, Anda masih memiliki kontrol atas itu - Anda bahkan tidak akan melihat nama file hilang atau dipindahkan atau apa pun. Itu bahkan digunakan untuk tempfile: beberapa implementasi membuat file dan segera memutuskan tautannya, sehingga tidak terlihat di sistem file, tetapi proses yang membuatnya menggunakannya dengan normal. Plugin Flash sangat menyukai metode ini: semua file video yang diunduh terbuka, tetapi sistem file tidak menunjukkannya.

Jadi, jawabannya adalah, sementara proses memiliki file masih dibuka, Anda seharusnya tidak berharap mendapatkan ruang kembali. Ini tidak dibebaskan, sedang digunakan secara aktif. Ini juga salah satu alasan mengapa aplikasi harus benar-benar menutup file ketika mereka selesai menggunakannya. Dalam penggunaan normal, Anda seharusnya tidak menganggap ruang itu gratis, dan ini juga seharusnya tidak terlalu umum sama sekali - dengan pengecualian file sementara yang tidak terhubung dengan sengaja, seharusnya tidak ada file yang Anda inginkan. pertimbangkan untuk tidak digunakan, tetapi masih terbuka. Coba tinjau apakah ada proses yang banyak melakukan ini dan pertimbangkan bagaimana Anda menggunakannya, atau hanya mencari lebih banyak ruang.

orion
sumber
24

File dihapus dari sistem file di mana dihapus referensi ke inode ini. Referensi dapat di disk (tautan di direktori mana saja), dan .. dari aplikasi yang terbuka. Jika Anda menghapus file - Anda hanya menghapus referensi dari disk, tetapi - masih ada referensi dari aplikasi.

Anda dapat "mengosongkan" ruang dalam dua cara kemudian:

  1. seperti yang disebutkan di atas - Anda dapat mematikan aplikasi, yang membuka file.
  2. Anda dapat ... memotong file. Bahkan jika itu dihapus:

Jika Anda tahu pid - lihat file apa yang dibuka oleh pid ini: ls -l / proc / PID / fd Anda lihat di sini tautan seperti:

undefine @ uml: ~ $ ls -l / proc / 18596 / fd
razem 0
lrwx ------ 1 undefine undefine 64 lut 1 00:06 0 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:06 1 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:05 2 -> / dev / pts / 30
lr-x ------ 1 undefine undefine 64 lut 1 00:06 3 -> / home / undefine / x (dihapus)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode: inotify

Seperti yang Anda lihat - 3 fd dihapus. Anda dapat memotongnya dengan perintah (misalnya):

undefine @ uml: ~ $:> / proc / 18596 / fd / 3
undefine @ uml: ~ $ 

Ingat bahwa jika aplikasi membaca dari file ini - itu bisa berbahaya bagi mereka. Tapi - jika itu hanya file log - Anda dapat memotongnya dengan aman.

undefine
sumber
perhatikan bahwa setelah memotong file, proses asli yang menahannya masih dapat menambahkan sampai akhir (di mana ia mengharapkan akhir). hasilnya tampak besar tetapi file jarang yang mengambil lebih sedikit ruang pada disk (jika sistem file mendukung file jarang) dan mereka masih terus bertambah!
törzsmókus
iya nih. Jika sesuatu menulis ke file, itu akan terjadi pada disk. Sulit menghindarinya tanpa menghentikan aplikasi yang menulis ke disk;)
undefine
8

Seperti yang orang lain katakan lsofdapat digunakan untuk membuat daftar semua file yang dihapus yang masih pada disk karena deskriptor file terbuka. Namun, ini mungkin daftar yang sangat panjang. Berikut adalah perintah yang mencantumkan file-file ini diurutkan berdasarkan ukuran naik dalam byte:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

Mungkin ada cara yang lebih ringkas untuk melakukan ini tetapi perintah di atas bekerja untuk saya.

jcoffland
sumber
5

Ruang tidak segera dibebaskan karena proses yang berjalan masih memiliki pegangan file terbuka ke file yang baru saja dihapus. Lagi pula, jika suatu proses masih mencoba menggunakan file, Anda mungkin tidak benar-benar ingin kernel menyingkirkannya (file). Itu mungkin membuat prosesnya sedikit kesal. Cara terbaik (dan hanya, sejauh yang saya tahu) untuk membebaskan ruang adalah melakukan apa yang Anda lakukan - bunuh prosesnya.

John
sumber
Mungkin kalimat yang lebih baik daripada "hanya cara kerjanya" adalah "jika suatu proses masih menggunakan file Unix seharusnya tidak mencoba untuk menyingkirkannya."
Bratchley
Poin bagus. Saya telah menambahkan itu ke jawabannya.
John
-1

(Mint 17.1)

TL; DR:

  • Periksa dengan sudo baobab(Penganalisis Penggunaan Disk).
  • Bersihkan rootsampah pengguna.

Konteks

Saya terjebak dengan ruang yang semakin berkurang sementara saya terus-menerus menghapus file. Saya menginstal trash-clipaket untuk mengosongkan sampah, tetapi ini tidak membantu. Akhirnya, saya perhatikan bahwa ketika saya menjalankan baobab(Disk Usage Analyzer di GUI, setidaknya pada Mint 17.1) untuk memeriksa struktur ruang disk, itu memberi peringatan bahwa beberapa folder tidak dapat diakses. Jadi saya menjalankannya sebagai rootmenggunakan sudo baobab. Ini mengungkapkan masalahnya. Banyak file yang telah dihapus berada di trashbin rootpengguna, bukan pengguna saya sendiri. Jadi, saya tidak bisa membebaskan ruang. Lalu saya cukup mengosongkan sampah menggunakan sebagai root ( sudo trash-cli) dan semua ruang saya kembali.

Hapus
sumber
-1

Coba gunakan perintah di bawah ini

lsof | grep deleted

dan kemudian bunuh pid dari file yang dihapus.

Sumit Tyagi
sumber
OP sejauh itu; ini tidak menjawab pertanyaan mereka.
Jeff Schaller