จะพบไฟล์ขนาดใหญ่ที่ถูกลบ แต่ยังคงเปิดอยู่ในแอปพลิเคชั่นได้อย่างไร? เราจะลบไฟล์นั้นออกได้อย่างไรแม้ว่ากระบวนการจะเปิดขึ้นมาก็ตาม
สถานการณ์คือเรากำลังเรียกใช้กระบวนการที่เติมไฟล์บันทึกในอัตราที่ยอดเยี่ยม ฉันรู้เหตุผลและฉันสามารถแก้ไขได้ ก่อนหน้านี้ฉันต้องการ rm หรือล้างไฟล์บันทึกโดยไม่ต้องปิดกระบวนการ
เพียงแค่ทำการrm output.log
ลบการอ้างอิงไปยังไฟล์เท่านั้น แต่จะยังคงใช้พื้นที่บนดิสก์ต่อไปจนกว่ากระบวนการจะสิ้นสุดลง แย่ลง: หลังจากrm
วันนี้ฉันไม่มีทางที่จะค้นหาไฟล์หรือว่ามันใหญ่แค่ไหน! มีวิธีใดในการค้นหาไฟล์และอาจทำให้มันว่างเปล่าแม้ว่ามันจะยังคงเปิดอยู่ในกระบวนการอื่นหรือไม่?
ฉันอ้างถึงระบบปฏิบัติการบน Linux เป็นพิเศษเช่น Debian หรือ RHEL
rm
ไฟล์ ed ทั้งหมดที่ยังคงเปิดอยู่ได้อย่างไร
lsof | grep "(deleted)"
เพื่อค้นหาลบเช่น เมื่อไม่มีกระบวนการที่เปิดไฟล์ที่ถูกลบอีกต่อไปเคอร์เนลจะทำให้ inode และดิสก์บล็อกว่าง กระบวนการไม่มี "ตัวจัดการ" ซึ่งพวกเขาสามารถได้รับการแจ้งเตือนว่าไฟล์ที่เปิดและถูกล็อคเป็นหลักได้ถูกลบออกจากดิสก์
lsof | grep '(deleted)'
ทำงานบน Linux ได้เช่นกัน บน Linux คุณสามารถได้รับแจ้งถึงการลบไฟล์ (แม้แต่ไฟล์ที่ไม่มีรายการในไดเรกทอรีอื่นที่ไม่ใช่ / proc / some-pid / fd อีกต่อไป) ด้วยกลไก inotify (เหตุการณ์ IN_DELETE_SELF)
somefile
และเปิดใน VIM จากนั้นทำการrm
แก้ไขในกระบวนการทุบตีอีกครั้ง ฉันเรียกใช้แล้วlsof | grep somefile
และมันไม่ได้อยู่ในนั้นแม้ว่าไฟล์จะเปิดใน VIM
lsof -p <pid>
เพื่อแสดงรายการไฟล์ที่เปิดและขนาดไฟล์ ไฟล์ที่ถูกลบจะมีไฟล์(deleted)
อยู่ข้างๆ ไฟล์ที่ถูกลบจะถูกลิงค์ที่/proc/<pid>/fd/1
อาจเป็นไปได้ ฉันไม่ทราบวิธีที่จะทำให้กระบวนการหยุดเขียนลงไฟล์ descriptor ของมันโดยไม่ยกเลิก ฉันคิดว่าจะขึ้นอยู่กับกระบวนการ