ฉันจะกู้คืนพื้นที่ว่างบนไฟล์ที่ถูกลบโดยไม่ต้องเริ่มกระบวนการอ้างอิงได้อย่างไร


12

เมื่อไฟล์ขนาดใหญ่ถูกลบบนเซิร์ฟเวอร์ไฟล์อาจยังคงถูกอ้างอิงโดยกระบวนการดังนั้นระบบไฟล์จึงไม่มีพื้นที่ว่างมากขึ้น

ฉันพยายามใช้lsofแต่ดูเหมือนว่าไม่ได้รายการไฟล์ที่ถูกลบ fuser -cทำได้ดีกว่า แต่รายการของกระบวนการยาวเกินกว่าที่จะตรวจสอบได้สำหรับแต่ละกระบวนการโดยเฉพาะเนื่องจากแต่ละกระบวนการเป็นกระบวนการของออราเคิล

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

มันเกิดขึ้นบางครั้งไฟล์จะถูกลบโดยแอปพลิเคชันหรือผู้ใช้เช่นล็อกไฟล์และไฟล์นี้ยังคงถูกอ้างอิงโดยกระบวนการที่ไม่สามารถรีสตาร์ทได้

มีวิธีการสินค้าเพื่อเรียกคืนพื้นที่ดิสก์ในไฟล์ที่ถูกลบโดยไม่ต้องเริ่มกระบวนการที่มีการอ้างอิงถึงไฟล์ที่ถูกลบนี้หรือไม่?


สำหรับการอ้างอิง .. วิธีที่ดีกว่าในการลบไฟล์ที่เปิดอยู่คือการคัดลอก / dev / null ไปยังไฟล์cp /dev/null file
Mike

@Mike cp /dev/nullเป็นคำสั่ง null เนื่องจากcpไม่มีสิ่งใดที่จะคัดลอกการเปลี่ยนเส้นทางแบบง่ายจะเทียบเท่า:>fileหรือแม้กระทั่งอย่างเคร่งครัด>file
jlliagre

คำตอบ:


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

ค้นหาตัวอธิบายไฟล์ที่เปิดทั้งหมด

ลบ Grep แล้ว

StdError เป็น / dev / null

เอาท์พุท:

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

หรือคุณสามารถใช้awk

find / proc / * / fd -ls 2> / dev / null | awk '/ ลบ / {พิมพ์ $ 11}';

ผลลัพธ์ awk (ทดสอบในทุบตี Ubuntu 12.04):

/proc/28680/fd/113

ค้นหาและตัดไฟล์ที่ลบทั้งหมด (ทดสอบใน bash Ubuntu 12.04):

(อย่าทำเช่นนี้หากคุณไม่ทราบว่าคุณทำอะไร)

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

-pพรอมต์ก่อนดำเนินการตัดทอน

วิธีที่ดีกว่าคือการตัดเอง

ตัดเอง:

: > /proc/28680/fd/113

หรือ:

> /proc/28680/fd/113

หรือ:

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

สนุก ;)


+1 แต่ฉันยังต้องใช้ sudo เพื่อเรียกใช้คำสั่งเหล่านี้
79E09796

6

นี่คือตัวอย่างง่ายๆของless:

สมมติว่าเรามีไฟล์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% /

ตอนนี้ฉันเปิดไฟล์นั้นด้วยless(ใช่มันเป็นไฟล์ไบนารี ... ไม่เป็นไร)

$ less /tmp/my10MBfile &

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

จากนั้นฉันก็ลบไฟล์นั้น

$ 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% /

มันยังอยู่ที่นั่น แต่ถูกลบไปแล้ว ดูคอลัมน์ที่ 4 ของเอาต์พุต lsof: File Descriptor number 4 open for Reading (4r)

มารัน GDB กันเถอะ!

$ gdb -p $(pidof less)

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

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

แค่นั้นแหละ!

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

ยินดีต้อนรับกลับ 10 MB ของเรา :)

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

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

กระบวนการยังคงทำงานอยู่


2
ตกลง แต่นานเท่าไหร่ กระบวนการจำนวนมากเพียงแค่ออกหากพวกเขาไม่สามารถเขียนลงในล็อกไฟล์
longneck

Logrotate ไม่สามารถทำสิ่งนี้ให้คุณได้?
maxxvw

logrotate ส่งสัญญาณปิดโพรเซสและเปิดสัญญาณใหม่
longneck

2

คำสั่งนี้จะแสดงไฟล์ที่ถูกลบทั้งหมดที่ยังคงเปิดอยู่ในระบบ Solaris:

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

คุณสามารถตัดส่วนที่คุณต้องการด้วยคำสั่งนี้:

:> /proc/p/fd/x

โดยที่ p เป็น id กระบวนการและ x ตัวให้คำอธิบายไฟล์ที่ส่งคืนโดยคำสั่งแรก

ไม่ต้องกังวลหากมีบางโปรแกรมที่ขนาดรายงานโดยlsถูกเรียกคืนเป็นขนาดก่อนที่จะถูกตัดทอนสักครู่ขนาดจริงที่ใช้บนดิสก์จะเล็กกว่ามากเนื่องจากไฟล์นี้มีขนาดเล็ก


0

คุณสามารถลองไปที่ไดเรคทอรี/proc/<pid>/fdและตัดไฟล์ที่เกี่ยวข้องให้คำอธิบาย สมมติว่า fd = 3 คะแนนไปยังไฟล์ที่ถูกลบ pid == 123:

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

คุณมีตัวอย่างที่วิธีการนี้ทำงานอย่างไร ไม่สามารถหาวิธีแก้ไข FD ได้จากที่นั่น
maxxvw

ใช่มันใช้งานได้ แต่จะหา pid ของกระบวนการได้อย่างไร?
ujjain

-2

ไม่มีวิธีแก้ปัญหาเหล่านี้สำหรับฉัน หลังจากใช้ Bleachbit เป็นรูทฉันสามารถเพิ่มพื้นที่ว่างที่เกี่ยวข้องกับไฟล์ที่ถูกลบได้อย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.