คุณอาจต้องการลองทำสิ่งต่อไปนี้:
find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'
find ใช้เพื่อค้นหาไฟล์ที่ตรงกับเกณฑ์ที่กำหนด
-mtime +7
เลือกไฟล์ที่เก่ากว่า 7 วันเท่านั้น (คุณสามารถใช้ค่าอื่น ๆ ได้)
-exec fuser -s {} ';'
เรียก fuser ในโหมดไม่ต้องป้อนข้อมูลสำหรับทุกไฟล์ที่ตรงกับเกณฑ์ความเก่า fuser ส่งกลับค่า 0 (= true) สำหรับทุกไฟล์ที่เข้าถึงได้ในขณะนี้และ 1 (= false) สำหรับไฟล์ที่ไม่สามารถเข้าถึงได้ เนื่องจากเราสนใจเฉพาะสิ่งที่ไม่สามารถเข้าถึงได้เราจึงกล่าวถึง-not
เรื่องนี้-exec
-exec echo {} ';'
เพียงพิมพ์ชื่อไฟล์ทั้งหมดที่ตรงกับเกณฑ์ คุณอาจต้องการใช้-exec rm {} ';'
แทนที่นี่ แต่เนื่องจากอาจลบไฟล์ที่ยังใช้งานอยู่บางอย่างฉันคิดว่าการทำเสียงก้องง่ายกว่าปลอดภัยกว่าก่อน
- แก้ไข:คุณอาจต้องการเพิ่มสิ่งที่ชอบ
-name 'foo*.bar'
หรือ-uid 123
จำกัด ผลกระทบของการล้างข้อมูลให้กับรูปแบบไฟล์หรือ ID ผู้ใช้เฉพาะเพื่อหลีกเลี่ยงผลกระทบโดยไม่ตั้งใจ
จนถึงจุดสุดท้าย: พิจารณาว่าอาจมีไฟล์ที่เขียนครั้งเดียวเท่านั้น (เช่นตอนบูตระบบ) แต่อ่านบ่อยครั้ง (เช่น X-session-cookie) ดังนั้นฉันขอแนะนำให้เพิ่มการตรวจสอบชื่อเพื่อให้มีผลกับไฟล์ที่สร้างขึ้นโดยโปรแกรมที่ผิดพลาดของคุณเท่านั้น
edit2:
สำหรับคำถามสุดท้ายของคุณ: ไฟล์จะไม่ถูกลบออกจากดิสก์จนกว่าจะไม่มีกระบวนการใด ๆ ที่มีการจัดการแบบเปิด (อย่างน้อยสำหรับระบบไฟล์ linux ดั้งเดิม) ปัญหาคือรายการไดเรกทอรีจะถูกลบทันทีซึ่งหมายความว่าตั้งแต่เวลาที่คุณลบไฟล์ไม่มีกระบวนการใหม่สามารถเปิดไฟล์ได้อีกต่อไป (เนื่องจากไม่มีชื่อไฟล์แนบอยู่)
ดูรายละเอียดได้ที่:
/programming/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux
edit3:แต่ถ้าฉันต้องการทำให้กระบวนการทั้งหมดเป็นแบบอัตโนมัติล่ะ
อย่างที่ฉันบอกไปแล้วอาจมีไฟล์ที่เขียนครั้งเดียวแล้วอ่านทุก ๆ ครั้ง (เช่นคุกกี้เซสชัน X, ไฟล์ PID ฯลฯ ) สิ่งเหล่านี้จะไม่ถูกแยกออกจากสคริปต์ลบขนาดเล็กนี้ (ซึ่งเป็นสาเหตุที่คุณอาจต้องทำการทดสอบecho
ก่อนก่อนที่จะลบไฟล์)
วิธีหนึ่งในการนำโซลูชันที่ปลอดภัยมาใช้atime
คือ
atime
เก็บเวลาที่เข้าถึงไฟล์แต่ละครั้งล่าสุด แต่ตัวเลือกระบบไฟล์นั้นมักจะถูกปิดการใช้งานเพราะมันมีผลกระทบต่อประสิทธิภาพค่อนข้างมาก (ตามบล็อกนี้อยู่ที่ไหนสักแห่งในภูมิภาค 20-30%) มีrelatime
แต่มีหนึ่งเขียนเวลาเข้าถึงหากmtime
มีการเปลี่ยนแปลงดังนั้นอันนี้จะไม่ช่วยเรา
หากคุณต้องการใช้atime
ฉันขอแนะนำให้/tmp
ใช้พาร์ติชันแยกต่างหาก (เป็น ramdisk) เพื่อให้ประสิทธิภาพการทำงานของทั้งระบบไม่ใหญ่เกินไป
เมื่อatime
มีการใช้งานทั้งหมดที่คุณต้องทำคือการเปลี่ยนพารามิเตอร์ในบรรทัดคำสั่งข้างต้นด้วย-mtime
คุณอาจจะสามารถลบได้แต่ฉันจะเก็บไว้ที่นั่นเพื่อให้แน่ใจ (ในกรณีที่แอปพลิเคชันเปิดไฟล์ไว้เป็นระยะเวลานาน)-atime
-not -exec fuser -s {} ';'
แต่โปรดจำไว้ว่าให้ทดสอบคำสั่งที่ใช้echo
ก่อนที่คุณจะลบสิ่งที่ระบบของคุณต้องการ!