Başvuru işlemlerini yeniden başlatmadan silinmiş dosyalardaki boş alanı nasıl kurtarırım?


12

Bir sunucuda büyük dosyalar silindiğinde, dosyalara yine de işlemler tarafından başvurulabilir, bu nedenle dosya sisteminde daha fazla boş alan yoktur.

Lsof kullanmaya çalıştım , ancak silinen dosyaları listelememiş görünüyor. fuser -cdaha iyi bir iş çıkardı, ancak işlem listesi, her işlem için bir işlem yapmak için çok uzun, özellikle her işlem bir Oracle işlemi olduğundan.

bash-3.2# fuser -c /var
/var:      105o   29999o   20444c    3528c   27258o    7715o    3864o    3862o    2494o   18205o   17450co   17445co   14912co   14824co   14818co   14816o   14814o    8532c    8530c    7633com    7118o    6958o    6790c    6784co    6734o    6693o    6689o    6684o    6675o    6635o    6594c    6548o    6547o    6546o    6545o    6544o    6543o    6542o    6541o    6540o    6537o    6535o    6456o    6128co    6113o     335o     245co     229o     161o       8o
bash-3.2# du -hs /proc
 139T   /proc

Bazen bir dosya, örneğin bir günlük dosyası gibi bir uygulama veya kullanıcı tarafından silinir ve bu dosyaya yine yeniden başlatılamayan bir işlem tarafından başvurulur.

Bu silinen dosyaya başvurusu olan işlemi yeniden başlatmadan silinen dosyalardaki disk alanını geri kazanmak için mal yöntemleri var mı?


referans için .. açılmış bir dosyayı silmek için daha iyi bir yol / dev / null dosyayı kopyalamaktırcp /dev/null file
Mike

@Mike kopyalanacak hiçbir şeyi olmayan cp /dev/nullbir boş komut cp, basit bir yönlendirme kesinlikle eşdeğer :>fileveya hatta>file
jlliagre

Yanıtlar:


12
find /proc/*/fd -ls 2> /dev/null | grep '(deleted)'

Tüm açık dosya tanımlayıcılarını bulun.

Grep silindi.

/ Dev / null hatası

Çıktı:

160448715    0 lrwx------   1 user      user            64 Nov 29 15:34 /proc/28680/fd/113 -> /tmp/vteT3FWPX\ (deleted)

Veya awk kullanabilirsiniz

find / proc / * / fd -ls 2> / dev / null | awk '/ silindi / {print $ 11}';

awk çıkışı (bash Ubuntu 12.04'te test edilmiştir):

/proc/28680/fd/113

Silinen tüm dosyaları bulma ve kesme (Ubuntu 12.04'te test edilmiştir):

(NE YAPTIĞINIZI BİLMİYORSANIZ BU YAPMAYIN)

find /proc/*/fd -ls 2> /dev/null | awk '/deleted/ {print $11}' | xargs -p -n 1 truncate -s 0

-p önce istemi yürütmek kesiğinin

Daha iyi yol manuel kesme

Manuel kesme:

: > /proc/28680/fd/113

veya:

> /proc/28680/fd/113

veya:

truncate -s 0 /proc/28680/fd/113

Zevk almak ;)


+1, ama aynı zamanda sudo bu komutları çalıştırmak için gerekli
79E09796

6

İşte basit bir örnek less:

Bir dosyamız olduğunu varsayalım my10MBfile:

$ dd if=/dev/zero of=/tmp/my10MBfile bs=1M count=10
10+0 enregistrements lus
10+0 enregistrements écrits
10485760 octets (10 MB) copiés, 0,0454491 s, 231 MB/s

$ ls -l /tmp/my10MBfile
-rw-r--r-- 1 max max 10485760 avril 23 22:49 /tmp/my10MBfile

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

Şimdi bu dosyayı less(evet, ikili bir dosya ... boş verin) ile açıyorum

$ less /tmp/my10MBfile &

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile

Sonra o dosyayı kaldırıyorum

$ rm /tmp/my10MBfile

$ lsof -p $(pidof less) | grep 10MBfile
less    29351  max    4r   REG    8,3 10485760 521464 /tmp/my10MBfile (deleted)

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9225       4662  67% /

Hala orada, ama silindi. Lsof çıktısının 4. sütununa bakın: Okuma için açık Dosya Tanımlayıcı numarası 4 (4r)

GDB'yi çalıştıralım!

$ gdb -p $(pidof less)

GNU gdb (GDB) 7.4.1-debian
....
Attaching to process 29351
....

(gdb) p close(4)
$1 = 0
(gdb) q

Bu kadar!

$ df -m /tmp
/dev/disk/by-uuid/6835b2fd-971d-420c-ba18-3c729ec2e8a0     14637  9215       4672  67% /

Bizim 10 MB tekrar açığız :)

$ ls /proc/29351/fd
0  1  2  3

$ ps 29351
29351 pts/0    S+     0:00 less /tmp/my10MBfile

İşlem hala çalışıyor.


2
Tamam, ama ne kadar süre? birçok dosya günlük dosyalarına yazamazlarsa çıkarlar.
longneck

Logrotate bunu sizin için yapamaz mı?
maxxvw

logrotate, işleme günlük dosyasını kapatmak ve yeni bir dosya açmak için bir sinyal gönderir.
longneck

2

Bu komut, bir Solaris sisteminde hala açık olan tüm silinen dosyaları gösterir:

find /proc/*/fd -type f -links 0

İstediğinizden emin olduğunuz komutları bu komutla kısaltabilirsiniz:

:> /proc/p/fd/x

p, işlem kimliğidir ve x, ilk komut tarafından döndürülen dosya tanımlayıcıdır.

Bazı programlarda, rapor edilen lsboyut bir süre sonra kesilmeden önceki boyuta geri döndürülürse endişelenmeyin , dosya artık seyrek olduğundan diskte kullanılan gerçek boyut çok daha küçük olacaktır.


0

/proc/<pid>/fdDizin ve kısaltılmış dosya tanımlayıcısına gitmeyi deneyebilirsiniz . Diyelim ki fd = silinen pid == 123 dosyasına 3 puan:

# echo "" >! /proc/123/fd/3

bu yöntemin işe yaradığı bir örnek var mı?
FD'yi

Evet, bu işe yarıyor, ancak sürecin pidini nasıl bulabilirim?
ujjain

-2

Bu çözümlerin hiçbiri benim için işe yaramadı. Yalnızca Bleachbit'i kök olarak kullandıktan sonra, silinen dosyalarla ilişkili alanı düzgün bir şekilde serbest bırakabildim.

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.