Açık tutulan silinmiş dosyalardan disk alanını boşaltmanın en iyi yolu


28

Merhaba Silinmiş çok fazla dosya var ama nedense silinmiş dosyalarla ilişkilendirilen disk alanı disk alanını alan dosyanın işlemini tamamen kesinceye kadar kullanılamıyor

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

Yukarıdaki silinen dosya tarafından alınan disk alanı, bir dosya yolunu otomatik olarak tamamlamak için sekme tuşunu kullanmaya çalışırken olduğu gibi sorunlara neden oluyor bash: cannot create temp file for here-document: No space left on device

Ancak kill -9 1623bu PID için alan çalıştırdıktan sonra serbest bırakılıyor ve artık hata alamıyorum.

Benim sorularım:

  • Dosya ilk silindiğinde neden bu alan boş bırakılmıyor?
  • Silinen dosyalarla ilişkili dosya alanını geri almanın en iyi yolu nedir?

ve lütfen kullandığım herhangi bir yanlış terminolojiyi veya bu durumla ilgili diğer ilgili ve ilgili herhangi bir bilgiyi bana bildirin.

Yanıtlar:


26

Unices'de, dosya adları sadece dosyanın bulunduğu belleğe işaret eden işaretçilerdir (inode'lar) (bir sabit sürücü veya hatta RAM destekli bir dosya sistemi olabilir). Her dosya, kendisine verilen bağlantıların sayısını kaydeder: bağlantılar dosya adı (aynı dosyaya birden çok sabit bağlantı varsa çoğul olabilir) ve ayrıca bir dosya her açıldığında, işlem aslında "bağlantıyı" tutar. aynı alan.

Boşluk, yalnızca hiçbir bağlantı kalmamışsa fiziksel olarak serbest bırakılır (bu nedenle buna ulaşmak imkansızdır). Bu tek mantıklı seçim: dosya kullanılırken, başka birinin artık erişemediği durumlarda önemli değil: siz kullanıyorsunuz ve kapatana kadar hala üzerinde kontrol sahibi oluyorsunuz - dosya adını bile fark etmiyorsunuz gitti ya da taşındı ya da her neyse. Bu, geçici dosyalar için bile kullanılır: bazı uygulamalar bir dosya oluşturur ve derhal bağlantısını kaldırın, bu nedenle dosya sisteminde görünmez, ancak onu oluşturan süreç normal olarak kullanır. Flash eklentisi özellikle bu yönteme düşkün: indirilen tüm video dosyaları açık tutulur, ancak dosya sistemi bunları göstermiyor.

Süreçleri hala açılmış dosyalar varken Yani, cevap, sen edilir olmamalıdır uzay geri almak için bekliyoruz. Serbest bırakılmadı, aktif olarak kullanılıyor. Bu aynı zamanda uygulamaların, dosyaları kullanmayı bitirdiğinde dosyaları gerçekten kapatması gerektiğinin nedenlerinden biridir. Normal kullanımda, bu alanı boş olarak düşünmemelisiniz ve bu da çok yaygın olmamalıdır - bilerek bağlanmamış geçici dosyalar dışında, gerçekten yapacağınız hiçbir dosya olmamalıdır kullanılmamış, ancak hala açık. Bunu çok fazla yapan bir işlem olup olmadığını incelemeye çalışın ve nasıl kullandığınızı düşünün ya da daha fazla yer bulun.


24

Dosyalar bu inode'a yapılan herhangi bir referansın silindiği dosya sisteminden silinir. Referans diskte (herhangi bir dizindeki link) ve .. açık uygulamalardan olabilir. Dosyayı kaldırırsanız - yalnızca diskteki referansı silersiniz, ancak - yine de uygulamadan referans vardır.

Sonra boşluğu iki şekilde "boşaltabilirsiniz":

  1. Yukarıda da belirtildiği gibi - dosyayı açan uygulamayı öldürebilirsiniz.
  2. yapabilirsiniz ... dosyayı kısaltabilirsiniz. Silinmiş olsa bile:

Pid biliyorsanız - bu pid için hangi dosyaların açık olduğuna bakın: ls -l / proc / PID / fd

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 (silindi)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode: inotify

Gördüğünüz gibi - 3 fd silindi. komutuyla kısaltabilirsiniz (örneğin):

undefine @ uml: ~ $:> / proc / 18596 / fd / 3
tanımsız @ uml: ~ $ 

Uygulama bu dosyadan okursanız - onlar için tehlikeli olabileceğini unutmayın. Ancak - yalnızca bir günlük dosyasıysa - güvenli bir şekilde kesebilirsiniz.


unutmayın sonra (o sonunu beklediği yerde) dosyasını kesiliyor, orijinal işlem ekleme sona hala olabilir tutarak. Sonuç görünüşte büyük ama diskte daha az yer kaplayan seyrek dosyalar (eğer dosya sistemi seyrek dosyaları destekliyorsa) ve hala büyümeye devam ediyorlar!
törzsmókus

Evet. Bir şey dosyaya yazarsa, diskte gerçekleşir. Diske yazan uygulamayı durdurmadan sakınmak zor;)
undefine

8

Diğerlerinin de söylediği lsofgibi açık dosya tanımlayıcıları nedeniyle hala diskte bulunan tüm silinmiş dosyaları listelemek için kullanılabilir. Ancak, bu çok uzun bir liste olabilir. İşte bu dosyaları bayt cinsinden artan boyuta göre sıralanmış olarak listeleyen bir komut:

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

Bunu yapmanın daha özlü bir yolu olabilir, ancak yukarıdaki komut benim için işe yaradı.


5

Alan hemen serbest bırakılmaz, çünkü çalışan işlem hala silinen dosyaya açık bir dosya tanıtıcısına sahiptir. Sonuçta, eğer bir işlem hala bir dosyayı kullanmaya çalışıyorsa, muhtemelen çekirdeğin ondan (dosyadan) kurtulmasını istemezsiniz. Bu işlem biraz üzülebilir. Alanı boşaltmanın en iyi (ve sadece, bildiğim kadarıyla) yolu, yaptığınız şeyi yapmaktır - süreci öldürmek.


Muhtemelen "nasıl çalıştığı" ndan daha iyi bir cümle "eğer bir işlem hala bir dosya kullanıyorsa, Unix ondan kurtulmaya çalışmamalıdır."
Bratchley

İyi bir nokta. Bunu cevaba ekledim.
John

-1

(Nane 17.1)

TL; DR:

  • İle inceleyin sudo baobab(Disk Kullanımı Analizörü).
  • rootKullanıcının çöpünü temizle .

bağlam

Dosyaları sürekli silerken alanım azaldı. trash-cliÇöp kutusunu boşaltmak için paketi kurdum , ancak bu işe yaramadı. Sonunda, baobabdisk alanı yapısını incelemek için çalıştırdığımda (GUI’de en azından Nane 17.1’de Disk Kullanımı Analizörü), bazı klasörlerin erişilebilir olmadığı konusunda bir uyarı verdiğini fark ettim . Bu yüzden rootkullanarak koştum sudo baobab. Bu sorunu ortaya çıkardı. Silinen dosyaların çoğu rootkullanıcının kendi çöp kutusuna aitti, kendi kullanıcım değil. Böylece, alanı boşaltamazdım. Sonra çöpü root ( sudo trash-cli) kullanarak boşalttım ve tüm alanım geri döndü.


-1

Aşağıdaki komutu kullanmayı deneyin

lsof | grep deleted

ve sonra silinen dosyanın pidini öldürün.


OP o kadar ileri gitti; bu onların sorularını cevaplamaz.
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.