GNU/Linux >> Belajar Linux >  >> Linux

Cara membersihkan folder tmp dengan aman di Linux

Anda mungkin ingin mencoba sesuatu seperti itu:

find /tmp -mtime +7 -and -not -exec fuser -s {} ';' -and -exec echo {} ';'

find digunakan untuk mencari file yang sesuai dengan kriteria tertentu.

  • -mtime +7 hanya memilih file yang lebih lama dari 7 hari (Anda dapat menggunakan nilai lainnya)
  • -exec fuser -s {} ';' memanggil fuser dalam mode senyap untuk setiap file yang cocok dengan kriteria lama. fuser mengembalikan 0 (=true) untuk setiap file yang telah diakses saat ini dan 1 (=false) untuk file yang tidak diakses. Karena kami hanya tertarik pada yang tidak dapat diakses, kami menempatkan -not di depan -exec ini
  • -exec echo {} ';' cukup cetak semua nama file yang cocok dengan kriteria. Anda mungkin ingin menggunakan -exec rm {} ';' sebagai gantinya di sini, tetapi karena ini dapat menghapus beberapa file yang masih digunakan, menurut saya lebih aman untuk melakukan gema sederhana terlebih dahulu.
  • sunting: Anda mungkin ingin menambahkan sesuatu seperti -name 'foo*.bar' atau -uid 123 untuk membatasi efek pembersihan pada pola file atau ID pengguna tertentu untuk menghindari efek yang tidak disengaja.

Ke poin terakhir:Pertimbangkan bahwa mungkin ada file yang hanya ditulis sekali (mis. Saat boot sistem) tetapi sering dibaca (mis. Cookie sesi-X apa pun). Oleh karena itu, saya sarankan untuk menambahkan beberapa pemeriksaan nama agar hanya memengaruhi file yang dibuat oleh program Anda yang rusak.

edit2: Untuk pertanyaan terakhir Anda:File tidak akan dihapus dari disk sampai tidak ada proses yang memiliki pegangan terbuka untuknya (setidaknya untuk sistem file linux asli). Masalahnya adalah bahwa entri direktori segera dihapus yang berarti sejak Anda menghapus file, tidak ada lagi proses baru yang dapat membuka file tersebut (karena tidak ada nama file yang dilampirkan padanya).

Untuk detailnya, lihat:https://stackoverflow.com/questions/3181641/how-can-i-delete-a-file-upon-its-close-in-c-on-linux

edit3: Namun bagaimana jika saya ingin mengotomatiskan seluruh proses?

Seperti yang saya katakan, mungkin ada file yang ditulis sekali dan kemudian dibaca sesekali (mis. Cookie sesi X, file PID, dll.). Itu tidak akan dikecualikan oleh skrip penghapusan kecil ini (yang merupakan alasan mengapa Anda mungkin ingin melakukan uji coba dengan echo terlebih dahulu sebelum benar-benar menghapus file).

Salah satu cara untuk mengimplementasikan solusi yang aman adalah dengan menggunakan atime .
atime menyimpan waktu setiap file terakhir diakses. Tetapi opsi sistem file itu sering dinonaktifkan karena memiliki dampak kinerja yang cukup besar (menurut blog ini di suatu tempat di wilayah 20-30%). Ada relatime , tetapi yang itu hanya menulis waktu akses jika mtime telah berubah, jadi yang ini tidak akan membantu kami.

Jika Anda ingin menggunakan atime , saya akan merekomendasikan untuk memiliki /tmp pada partisi terpisah (idealnya ramdisk) sehingga dampak kinerja pada keseluruhan sistem tidak terlalu besar.

Sekali atime diaktifkan, yang harus Anda lakukan adalah mengganti -mtime parameter pada baris perintah di atas dengan -atime .
Anda mungkin dapat menghapus -not -exec fuser -s {} ';' , tetapi saya akan menyimpannya di sana hanya untuk memastikan (kalau-kalau aplikasi membuat file tetap terbuka untuk jangka waktu yang lama).

Namun perlu diingat untuk menguji perintah menggunakan echo sebelum Anda akhirnya menghapus hal-hal yang masih dibutuhkan sistem Anda!


Jangan gulung sendiri.

Debian/Ubuntu memiliki tmpreaper, mungkin juga tersedia di dist lainnya.

# tmpreaper - cleans up files in directories based on their age

sudo apt-get install tmpreaper

cat /etc/tmpreaper.conf 

Mengenai bagian terakhir dari pertanyaan Anda:

Meskipun menurut saya tidak ada mode buka/pembuatan 'hapus-ini-jika-saya-mati', sebuah proses dapat dengan aman menghapus file secara langsung setelah membuatnya, selama itu tetap menangani file tersebut tetap terbuka. Kernel kemudian akan menyimpan file pada disk dan segera setelah proses terakhir yang membuka file keluar (baik karena crash atau biasanya), ruang yang ditempati oleh file akan dibebaskan.

Untuk cara umum mengatasi masalah yang terkadang tidak dibersihkan oleh beberapa proses /tmp, saya sarankan untuk melihat mount namespaces, dijelaskan, misalnya di sini atau di sini. Jika proses yang dimaksud adalah daemon sistem, systemd dan fitur aslinya untuk mengizinkan sistem file pribadi /tmp mungkin menarik.


Linux
  1. Bagaimana Mengelola Kemampuan File Linux

  2. Cara menemukan File di Linux

  3. Cara Mengosongkan File Log di Linux

  1. Cara Membuat Swap di Linux

  2. Cara membuat file swap di Linux

  3. Cara memasang file iso di Linux

  1. Cara memindahkan file di Linux

  2. Cara Membuat File di Linux

  3. Bagaimana Mengganti Nama File di Linux?